freefem++-3.26-2/000755 000767 000767 00000000000 12245613627 012604 5ustar00hecht000000 000000 freefem++-3.26-2/0ldUserReadMe.txt000644 000767 000767 00000003103 12167254041 015730 0ustar00hecht000000 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.26-2/aclocal.m4000644 000767 000767 00000116004 12245613200 014431 0ustar00hecht000000 000000 # generated automatically by aclocal 1.13.1 -*- Autoconf -*- # Copyright (C) 1996-2012 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-2013 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.13' 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.13.1], [], [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.13.1])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-2013 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], [dnl Rely on autoconf to set up CDPATH properly. AC_PREREQ([2.50])dnl # expand $ac_aux_dir to an absolute path am_aux_dir=`cd $ac_aux_dir && pwd` ]) # AM_CONDITIONAL -*- Autoconf -*- # Copyright (C) 1997-2013 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-2013 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-2013 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-2013 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. # 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. 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 ]) 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-2013 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}" != 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-2013 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-2013 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-2013 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-2013 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 ]) # Copyright (C) 1999-2013 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. AC_DEFUN([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC_C_O])dnl AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl AC_REQUIRE_AUX_FILE([compile])dnl # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $[2] | sed ['s/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/']` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != 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 dnl Make sure AC_PROG_CC is never called again, or it will override our dnl setting of CC. m4_define([AC_PROG_CC], [m4_fatal([AC_PROG_CC cannot be called after AM_PROG_CC_C_O])]) ]) # Fake the existence of programs that GNU maintainers use. -*- Autoconf -*- # Copyright (C) 1997-2013 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-2013 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])]) # Check to make sure that the build environment is sane. -*- Autoconf -*- # Copyright (C) 1996-2013 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-2013 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-2013 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-2013 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-2013 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}']) m4_if([$1], [v7], [am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -'], [m4_case([$1], [ustar],, [pax],, [m4_fatal([Unknown tar format])]) AC_MSG_CHECKING([how to create a $1 tar archive]) # Loop over all known methods to create a tar archive until one works. _am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none' _am_tools=${am_cv_prog_tar_$1-$_am_tools} # Do not fold the above two line into one, because Tru64 sh and # Solaris sh will not grok spaces in the rhs of '-'. 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.26-2/acmacros.m4000644 000767 000767 00000001437 11406142255 014633 0ustar00hecht000000 000000 # Checks whether a compiler accepts a given flag # ---------------------------------------------- # $1 = compiler name # $2 = flag # $3 = make macro containing flags for that compiler # 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 AC_LANG_POP($1) ]) freefem++-3.26-2/acmpi.m4000644 000767 000767 00000024253 12212033334 014126 0ustar00hecht000000 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 "$ff_win32" = yes -a "$MPIRUN" != no ; then # if "$MPIRUN" != no ; tehn with_mpipath=`AS_DIRNAME(["$MPIRUN"])` with_mpipath=`AS_DIRNAME(["$with_mpipath"])` # 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 dnl if test "$with_mpilibs" != "no" ; then dnl fi 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" ff_MPI_INCLUDE="-I'$ff_MPI_INCLUDE_DIR' '-D_MSC_VER' '-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" 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 ff_MPI_INCLUDE="$with_mpiinc" 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 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.26-2/acoptim.m4000644 000767 000767 00000016320 12167254041 014476 0ustar00hecht000000 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 CHECK_COMPILE_FLAG(C,$ff_m64,CFLAGS) CHECK_COMPILE_FLAG(C,$ff_m64,CNOFLAGS) CHECK_COMPILE_FLAG(C++,$ff_m64,CXXFLAGS) CHECK_COMPILE_FLAG(Fortran 77,$ff_m64,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 AC_ARG_ENABLE(m32,[ --enable-m32 Turn on 32 bits architecture]) if test "$enable_m32" = yes then ff_m32=-m32 CHECK_COMPILE_FLAG(C,$ff_m32,CFLAGS) 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";; *) 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.26-2/AUTHORS000644 000767 000767 00000000234 11406142250 013636 0ustar00hecht000000 000000 Frdric Hecht Olivier Pironneau Antoine Le Hyaric Albert Ly freefem++-3.26-2/BUGS000644 000767 000767 00000004163 11406142250 013256 0ustar00hecht000000 000000 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.26-2/build/000755 000767 000767 00000000000 12245613623 013677 5ustar00hecht000000 000000 freefem++-3.26-2/ChangeLog000644 000767 000767 00000035057 11406142250 014353 0ustar00hecht000000 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.26-2/CheckAll000755 000767 000767 00000001203 12144236272 014167 0ustar00hecht000000 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.26-2/CheckAllEdp000755 000767 000767 00000003132 12211563370 014620 0ustar00hecht000000 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.26-2/compile000755 000767 000767 00000007072 11406142255 014160 0ustar00hecht000000 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.26-2/config-wrapper.h000755 000767 000767 00000000543 12167254041 015677 0ustar00hecht000000 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.26-2/config.guess000755 000767 000767 00000123646 11406142255 015130 0ustar00hecht000000 000000 #! /bin/sh # Attempt to guess a canonical system name. # 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 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. # Originally written by Per Bothner . # Please send patches to . Submit a context # diff and a properly formatted ChangeLog entry. # # This script attempts to guess a canonical system name similar to # config.sub. If it succeeds, it prints the system name on stdout, and # exits with 0. Otherwise, it exits with 1. # # The plan is that this can be called by configure scripts if you # don't specify an explicit build system type. 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 (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" >&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 -q "$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 ;' # 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 # 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 tupples: *-*-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 ;; *) 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 __ELF__ >/dev/null 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 0 ;; amiga:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; arc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; hp300:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mac68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; macppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme68k:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvme88k:OpenBSD:*:*) echo m88k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; mvmeppc:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pegasos:OpenBSD:*:*) echo powerpc-unknown-openbsd${UNAME_RELEASE} exit 0 ;; pmax:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sgi:OpenBSD:*:*) echo mipseb-unknown-openbsd${UNAME_RELEASE} exit 0 ;; sun3:OpenBSD:*:*) echo m68k-unknown-openbsd${UNAME_RELEASE} exit 0 ;; wgrisc:OpenBSD:*:*) echo mipsel-unknown-openbsd${UNAME_RELEASE} exit 0 ;; *:OpenBSD:*:*) echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} exit 0 ;; alpha:OSF1:*:*) if test $UNAME_RELEASE = "V4.0"; then UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` fi # 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 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/^[VTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` exit 0 ;; Alpha*:OpenVMS:*:*) echo alpha-hp-vms exit 0 ;; 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 0 ;; 21064:Windows_NT:50:3) echo alpha-dec-winnt3.5 exit 0 ;; Amiga*:UNIX_System_V:4.0:*) echo m68k-unknown-sysv4 exit 0;; *:[Aa]miga[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-amigaos exit 0 ;; *:[Mm]orph[Oo][Ss]:*:*) echo ${UNAME_MACHINE}-unknown-morphos exit 0 ;; *:OS/390:*:*) echo i370-ibm-openedition exit 0 ;; *:OS400:*:*) echo powerpc-ibm-os400 exit 0 ;; arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) echo arm-acorn-riscix${UNAME_RELEASE} exit 0;; SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) echo hppa1.1-hitachi-hiuxmpp exit 0;; 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 0 ;; NILE*:*:*:dcosx) echo pyramid-pyramid-svr4 exit 0 ;; DRS?6000:unix:4.0:6*) echo sparc-icl-nx6 exit 0 ;; DRS?6000:UNIX_SV:4.2*:7*) case `/usr/bin/uname -p` in sparc) echo sparc-icl-nx7 && exit 0 ;; esac ;; sun4H:SunOS:5.*:*) echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; i86pc:SunOS:5.*:*) echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; 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 0 ;; 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 0 ;; sun3*:SunOS:*:*) echo m68k-sun-sunos${UNAME_RELEASE} exit 0 ;; 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 0 ;; aushp:SunOS:*:*) echo sparc-auspex-sunos${UNAME_RELEASE} exit 0 ;; # 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 0 ;; atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) echo m68k-atari-mint${UNAME_RELEASE} exit 0 ;; milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) echo m68k-milan-mint${UNAME_RELEASE} exit 0 ;; hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) echo m68k-hades-mint${UNAME_RELEASE} exit 0 ;; *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) echo m68k-unknown-mint${UNAME_RELEASE} exit 0 ;; powerpc:machten:*:*) echo powerpc-apple-machten${UNAME_RELEASE} exit 0 ;; RISC*:Mach:*:*) echo mips-dec-mach_bsd4.3 exit 0 ;; RISC*:ULTRIX:*:*) echo mips-dec-ultrix${UNAME_RELEASE} exit 0 ;; VAX*:ULTRIX*:*:*) echo vax-dec-ultrix${UNAME_RELEASE} exit 0 ;; 2020:CLIX:*:* | 2430:CLIX:*:*) echo clipper-intergraph-clix${UNAME_RELEASE} exit 0 ;; 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 \ && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ && exit 0 echo mips-mips-riscos${UNAME_RELEASE} exit 0 ;; Motorola:PowerMAX_OS:*:*) echo powerpc-motorola-powermax exit 0 ;; Motorola:*:4.3:PL8-*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) echo powerpc-harris-powermax exit 0 ;; Night_Hawk:Power_UNIX:*:*) echo powerpc-harris-powerunix exit 0 ;; m88k:CX/UX:7*:*) echo m88k-harris-cxux7 exit 0 ;; m88k:*:4*:R4*) echo m88k-motorola-sysv4 exit 0 ;; m88k:*:3*:R3*) echo m88k-motorola-sysv3 exit 0 ;; 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 0 ;; M88*:DolphinOS:*:*) # DolphinOS (SVR3) echo m88k-dolphin-sysv3 exit 0 ;; M88*:*:R3*:*) # Delta 88k system running SVR3 echo m88k-motorola-sysv3 exit 0 ;; XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) echo m88k-tektronix-sysv3 exit 0 ;; Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) echo m68k-tektronix-bsd exit 0 ;; *:IRIX*:*:*) echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` exit 0 ;; ????????: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 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' i*86:AIX:*:*) echo i386-ibm-aix exit 0 ;; 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 0 ;; *: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 $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 echo rs6000-ibm-aix3.2.5 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 0 ;; *:AIX:*:[45]) 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 0 ;; *:AIX:*:*) echo rs6000-ibm-aix exit 0 ;; ibmrt:4.4BSD:*|romp-ibm:BSD:*) echo romp-ibm-bsd4.4 exit 0 ;; ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to exit 0 ;; # report: romp-ibm BSD 4.3 *:BOSX:*:*) echo rs6000-bull-bosx exit 0 ;; DPX/2?00:B.O.S.:*:*) echo m68k-bull-sysv3 exit 0 ;; 9000/[34]??:4.3bsd:1.*:*) echo m68k-hp-bsd exit 0 ;; hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) echo m68k-hp-bsd4.4 exit 0 ;; 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 # avoid double evaluation of $set_cc_for_build test -n "$CC_FOR_BUILD" || eval $set_cc_for_build if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null then HP_ARCH="hppa2.0w" else HP_ARCH="hppa64" fi fi echo ${HP_ARCH}-hp-hpux${HPUX_REV} exit 0 ;; ia64:HP-UX:*:*) HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` echo ia64-hp-hpux${HPUX_REV} exit 0 ;; 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 && $dummy && exit 0 echo unknown-hitachi-hiuxwe2 exit 0 ;; 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) echo hppa1.1-hp-bsd exit 0 ;; 9000/8??:4.3bsd:*:*) echo hppa1.0-hp-bsd exit 0 ;; *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) echo hppa1.0-hp-mpeix exit 0 ;; hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) echo hppa1.1-hp-osf exit 0 ;; hp8??:OSF1:*:*) echo hppa1.0-hp-osf exit 0 ;; i*86:OSF1:*:*) if [ -x /usr/sbin/sysversion ] ; then echo ${UNAME_MACHINE}-unknown-osf1mk else echo ${UNAME_MACHINE}-unknown-osf1 fi exit 0 ;; parisc*:Lites*:*:*) echo hppa1.1-hp-lites exit 0 ;; C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) echo c1-convex-bsd exit 0 ;; C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) echo c34-convex-bsd exit 0 ;; C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) echo c38-convex-bsd exit 0 ;; C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) echo c4-convex-bsd exit 0 ;; CRAY*Y-MP:*:*:*) echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; 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 0 ;; CRAY*TS:*:*:*) echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*T3E:*:*:*) echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; CRAY*SV1:*:*:*) echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; *:UNICOS/mp:*:*) echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' exit 0 ;; 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 0 ;; 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 0 ;; i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} exit 0 ;; sparc*:BSD/OS:*:*) echo sparc-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:BSD/OS:*:*) echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} exit 0 ;; *:FreeBSD:*:*) # Determine whether the default compiler uses glibc. eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #if __GLIBC__ >= 2 LIBC=gnu #else LIBC= #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` # GNU/KFreeBSD systems have a "k" prefix to indicate we are using # FreeBSD's kernel, but not the complete OS. case ${LIBC} in gnu) kernel_only='k' ;; esac echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} exit 0 ;; i*:CYGWIN*:*) echo ${UNAME_MACHINE}-pc-cygwin exit 0 ;; i*:MINGW*:*) echo ${UNAME_MACHINE}-pc-mingw32 exit 0 ;; i*:PW*:*) echo ${UNAME_MACHINE}-pc-pw32 exit 0 ;; x86:Interix*:[34]*) echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' exit 0 ;; [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) echo i${UNAME_MACHINE}-pc-mks exit 0 ;; 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 0 ;; i*:UWIN*:*) echo ${UNAME_MACHINE}-pc-uwin exit 0 ;; p*:CYGWIN*:*) echo powerpcle-unknown-cygwin exit 0 ;; prep*:SunOS:5.*:*) echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` exit 0 ;; *:GNU:*:*) # the GNU system echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` exit 0 ;; *: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/[-(].*//'`-gnu exit 0 ;; i*86:Minix:*:*) echo ${UNAME_MACHINE}-pc-minix exit 0 ;; arm*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; cris:Linux:*:*) echo cris-axis-linux-gnu exit 0 ;; ia64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; m68*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; mips:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips #undef mipsel #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mipsel #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips #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-gnu" && exit 0 ;; mips64:Linux:*:*) eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #undef CPU #undef mips64 #undef mips64el #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) CPU=mips64el #else #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) CPU=mips64 #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-gnu" && exit 0 ;; ppc:Linux:*:*) echo powerpc-unknown-linux-gnu exit 0 ;; ppc64:Linux:*:*) echo powerpc64-unknown-linux-gnu exit 0 ;; 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 ld.so.1 >/dev/null if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} exit 0 ;; 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-gnu ;; PA8*) echo hppa2.0-unknown-linux-gnu ;; *) echo hppa-unknown-linux-gnu ;; esac exit 0 ;; parisc64:Linux:*:* | hppa64:Linux:*:*) echo hppa64-unknown-linux-gnu exit 0 ;; s390:Linux:*:* | s390x:Linux:*:*) echo ${UNAME_MACHINE}-ibm-linux exit 0 ;; sh64*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sh*:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; sparc:Linux:*:* | sparc64:Linux:*:*) echo ${UNAME_MACHINE}-unknown-linux-gnu exit 0 ;; x86_64:Linux:*:*) echo x86_64-unknown-linux-gnu exit 0 ;; i*86:Linux:*:*) # The BFD linker knows what the default object file format is, so # first see if it will tell us. cd to the root directory to prevent # problems with other programs or directories called `ld' in the path. # Set LC_ALL=C to ensure ld outputs messages in English. ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ | sed -ne '/supported targets:/!d s/[ ][ ]*/ /g s/.*supported targets: *// s/ .*// p'` case "$ld_supported_targets" in elf32-i386) TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" ;; a.out-i386-linux) echo "${UNAME_MACHINE}-pc-linux-gnuaout" exit 0 ;; coff-i386) echo "${UNAME_MACHINE}-pc-linux-gnucoff" exit 0 ;; "") # Either a pre-BFD a.out linker (linux-gnuoldld) or # one that does not give us useful --help. echo "${UNAME_MACHINE}-pc-linux-gnuoldld" exit 0 ;; esac # Determine whether the default compiler is a.out or elf eval $set_cc_for_build sed 's/^ //' << EOF >$dummy.c #include #ifdef __ELF__ # ifdef __GLIBC__ # if __GLIBC__ >= 2 LIBC=gnu # else LIBC=gnulibc1 # endif # else LIBC=gnulibc1 # endif #else #ifdef __INTEL_COMPILER LIBC=gnu #else LIBC=gnuaout #endif #endif #ifdef __dietlibc__ LIBC=dietlibc #endif EOF eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 ;; 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 0 ;; 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 0 ;; 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 0 ;; i*86:XTS-300:*:STOP) echo ${UNAME_MACHINE}-unknown-stop exit 0 ;; i*86:atheos:*:*) echo ${UNAME_MACHINE}-unknown-atheos exit 0 ;; i*86:syllable:*:*) echo ${UNAME_MACHINE}-pc-syllable exit 0 ;; i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) echo i386-unknown-lynxos${UNAME_RELEASE} exit 0 ;; i*86:*DOS:*:*) echo ${UNAME_MACHINE}-pc-msdosdjgpp exit 0 ;; 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 0 ;; i*86:*:5:[78]*) 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 0 ;; 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 0 ;; 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 i386. echo i386-pc-msdosdjgpp exit 0 ;; Intel:Mach:3*:*) echo i386-pc-mach3 exit 0 ;; paragon:*:*:*) echo i860-intel-osf1 exit 0 ;; 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 0 ;; mini*:CTIX:SYS*5:*) # "miniframe" echo m68010-convergent-sysv exit 0 ;; mc68k:UNIX:SYSTEM5:3.51m) echo m68k-convergent-sysv exit 0 ;; M680?0:D-NIX:5.3:*) echo m68k-diab-dnix exit 0 ;; M68*:*:R3V[567]*:*) test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; 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) 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 0 /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ && echo i486-ncr-sysv4 && exit 0 ;; m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) echo m68k-unknown-lynxos${UNAME_RELEASE} exit 0 ;; mc68030:UNIX_System_V:4.*:*) echo m68k-atari-sysv4 exit 0 ;; TSUNAMI:LynxOS:2.*:*) echo sparc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; rs6000:LynxOS:2.*:*) echo rs6000-unknown-lynxos${UNAME_RELEASE} exit 0 ;; PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) echo powerpc-unknown-lynxos${UNAME_RELEASE} exit 0 ;; SM[BE]S:UNIX_SV:*:*) echo mips-dde-sysv${UNAME_RELEASE} exit 0 ;; RM*:ReliantUNIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; RM*:SINIX-*:*:*) echo mips-sni-sysv4 exit 0 ;; *: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 0 ;; PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort # says echo i586-unisys-sysv4 exit 0 ;; *:UNIX_System_V:4*:FTX*) # From Gerald Hewes . # How about differentiating between stratus architectures? -djm echo hppa1.1-stratus-sysv4 exit 0 ;; *:*:*:FTX*) # From seanf@swdc.stratus.com. echo i860-stratus-sysv4 exit 0 ;; *:VOS:*:*) # From Paul.Green@stratus.com. echo hppa1.1-stratus-vos exit 0 ;; mc68*:A/UX:*:*) echo m68k-apple-aux${UNAME_RELEASE} exit 0 ;; news*:NEWS-OS:6*:*) echo mips-sony-newsos6 exit 0 ;; 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 0 ;; BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. echo powerpc-be-beos exit 0 ;; BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. echo powerpc-apple-beos exit 0 ;; BePC:BeOS:*:*) # BeOS running on Intel PC compatible. echo i586-pc-beos exit 0 ;; SX-4:SUPER-UX:*:*) echo sx4-nec-superux${UNAME_RELEASE} exit 0 ;; SX-5:SUPER-UX:*:*) echo sx5-nec-superux${UNAME_RELEASE} exit 0 ;; SX-6:SUPER-UX:*:*) echo sx6-nec-superux${UNAME_RELEASE} exit 0 ;; Power*:Rhapsody:*:*) echo powerpc-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Rhapsody:*:*) echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} exit 0 ;; *:Darwin:*:*) case `uname -p` in *86) UNAME_PROCESSOR=i686 ;; powerpc) UNAME_PROCESSOR=powerpc ;; esac echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} exit 0 ;; *: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 0 ;; *:QNX:*:4*) echo i386-pc-qnx exit 0 ;; NSR-?:NONSTOP_KERNEL:*:*) echo nsr-tandem-nsk${UNAME_RELEASE} exit 0 ;; *:NonStop-UX:*:*) echo mips-compaq-nonstopux exit 0 ;; BS2000:POSIX*:*:*) echo bs2000-siemens-sysv exit 0 ;; DS/*:UNIX_System_V:*:*) echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} exit 0 ;; *: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 0 ;; *:TOPS-10:*:*) echo pdp10-unknown-tops10 exit 0 ;; *:TENEX:*:*) echo pdp10-unknown-tenex exit 0 ;; KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) echo pdp10-dec-tops20 exit 0 ;; XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) echo pdp10-xkl-tops20 exit 0 ;; *:TOPS-20:*:*) echo pdp10-unknown-tops20 exit 0 ;; *:ITS:*:*) echo pdp10-unknown-its exit 0 ;; SEI:*:*:SEIUX) echo mips-sei-seiux${UNAME_RELEASE} exit 0 ;; *:DRAGONFLY:*:*) echo ${UNAME_MACHINE}-unknown-dragonfly${UNAME_RELEASE} exit 0 ;; esac #echo '(No uname command or uname output not recognized.)' 1>&2 #echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 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"); 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 && $dummy && exit 0 # Apollos put the system type in the environment. test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } # 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 0 ;; c2*) if getsysinfo -f scalar_acc then echo c32-convex-bsd else echo c2-convex-bsd fi exit 0 ;; c34*) echo c34-convex-bsd exit 0 ;; c38*) echo c38-convex-bsd exit 0 ;; c4*) echo c4-convex-bsd exit 0 ;; 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.26-2/config.h.in000644 000767 000767 00000012346 12245613303 014624 0ustar00hecht000000 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 `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 /* 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 header file. */ #undef HAVE_MALLOC_H /* Define to 1 if you have the header file. */ #undef HAVE_MEMORY_H /* mpi_double_complex */ #undef HAVE_MPI_DOUBLE_COMPLEX /* Define to 1 if you have the header file. */ #undef HAVE_OPENGL_GL_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 /* Define to 1 if you have the header file. */ #undef HAVE_VECLIB_CBLAS_H /* Define to 1 if your C compiler doesn't accept -c and -o together. */ #undef NO_MINUS_C_MINUS_O /* 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.26-2/config.sub000755 000767 000767 00000074315 11406142255 014571 0ustar00hecht000000 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.26-2/configure000755 000767 000767 00002100726 12245613201 014507 0ustar00hecht000000 000000 #! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.69 for FreeFem++ 3.26-2. # # 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.26-2' PACKAGE_STRING='FreeFem++ 3.26-2' 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 FFCS_WINDOWS_FALSE FFCS_WINDOWS_TRUE TOOL_DYLIB_pardiso TOOL_COMPILE_pardiso TOOL_DYLIB_gsl TOOL_COMPILE_gsl TEST_FFPPMPI 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_parmetis TOOL_COMPILE_parmetis TOOL_DYLIB_nlopt TOOL_COMPILE_nlopt TOOL_DYLIB_mumps_seq TOOL_COMPILE_mumps_seq TOOL_DYLIB_mumps TOOL_COMPILE_mumps TOOL_DYLIB_mshmet TOOL_COMPILE_mshmet TOOL_DYLIB_mmg3d TOOL_COMPILE_mmg3d TOOL_DYLIB_metis TOOL_COMPILE_metis TOOL_DYLIB_lapack TOOL_COMPILE_lapack TOOL_DYLIB_ipopt TOOL_COMPILE_ipopt TOOL_DYLIB_hips TOOL_COMPILE_hips TOOL_DYLIB_fflapack TOOL_COMPILE_fflapack 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 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 FF_STATIC_LIB 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 OPTIM_TYPE ff_prefix_dir WIN32DLLTARGET LIBSNOCONSOLE WINDRESOBJ FFGLUTNAME FFMETIS_CFLAGS 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_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_wget with_mkl with_cadna enable_system_fftw enable_system_blas with_blas enable_openblas with_lapack with_arpack with_amd with_umfpack enable_static enable_pdf 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_metis with_metis_include with_metis_ldflags enable_mmg3d with_mmg3d_include with_mmg3d_ldflags enable_mshmet with_mshmet_include with_mshmet_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_parmetis with_parmetis_include with_parmetis_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 enable_gsl with_gsl_include with_gsl_ldflags enable_pardiso with_pardiso_include with_pardiso_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.26-2 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.26-2:";; 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 --disable-openblas Disable the automatic download of OpenBLAS --enable-static Build binaries with no shared library dependencies --disable-pdf Disable PDF documentation building --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-metis Do not use metis --disable-mmg3d Do not use mmg3d --disable-mshmet Do not use mshmet --disable-mumps Do not use mumps --disable-mumps_seq Do not use mumps_seq --disable-nlopt Do not use nlopt --disable-parmetis Do not use parmetis --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-gsl Do not use gsl --disable-pardiso Do not use pardiso 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-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-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-metis-include= Include directives for metis instead of automatic download --with-metis-ldflags= Link-time directives for metis 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-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-parmetis-include= Include directives for parmetis instead of automatic download --with-parmetis-ldflags= Link-time directives for parmetis 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-gsl-include= Include directives for gsl instead of automatic download --with-gsl-ldflags= Link-time directives for gsl 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 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.26-2 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.26-2, 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 # 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.13' 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}" != 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.26-2' 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. 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}' am__tar='$${TAR-tar} chof - "$$tardir"' am__untar='$${TAR-tar} xf -' 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 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 # 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 "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 " in *no*) { $as_echo "$as_me:${as_lineno-$LINENO}: to install missing package under debian or ubuntu, try: sudo apt-get install m4 bison patch cmake " >&5 $as_echo "$as_me: to install missing package under debian or ubuntu, try: sudo apt-get install m4 bison patch cmake " >&6;} as_fn_error $? " Sorry missing m4,bison,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 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 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 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" 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" 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 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 if test "x$CC" != xcc; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC and cc understand -c and -o together" >&5 $as_echo_n "checking whether $CC and cc understand -c and -o together... " >&6; } else { $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; } fi set dummy $CC; ac_cc=`$as_echo "$2" | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` if eval \${ac_cv_prog_cc_${ac_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. # We do the test twice because some compilers refuse to overwrite an # existing .o file with -o, though they will create one. ac_try='$CC -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { 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; } && test -f conftest2.$ac_objext && { { 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 eval ac_cv_prog_cc_${ac_cc}_c_o=yes if test "x$CC" != xcc; then # Test first that cc exists at all. if { ac_try='cc -c conftest.$ac_ext >&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_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then ac_try='cc -c conftest.$ac_ext -o conftest2.$ac_objext >&5' rm -f conftest2.* if { { 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; } && test -f conftest2.$ac_objext && { { 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 # cc works too. : else # cc exists but doesn't like -o. eval ac_cv_prog_cc_${ac_cc}_c_o=no fi fi fi else eval ac_cv_prog_cc_${ac_cc}_c_o=no fi rm -f core conftest* fi if eval test \$ac_cv_prog_cc_${ac_cc}_c_o = yes; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "#define NO_MINUS_C_MINUS_O 1" >>confdefs.h fi # FIXME: we rely on the cache variable name because # there is no other way. set dummy $CC am_cc=`echo $2 | sed 's/[^a-zA-Z0-9_]/_/g;s/^[0-9]/_/'` eval am_t=\$ac_cv_prog_cc_${am_cc}_c_o if test "$am_t" != 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 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 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()). if test $enable_ffcs = yes then FFMETIS_CFLAGS="-D__VC__" else FFMETIS_CFLAGS="-D__VC__ -D_MSC_VER" fi # 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 $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 # 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 { $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 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_m64" >&5 $as_echo_n "checking whether the C compiler accepts $ff_m64... " >&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_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 CNOFLAGS="$check_save_flags" 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_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 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 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 { $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 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 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 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-m32 was given. if test "${enable_m32+set}" = set; then : enableval=$enable_m32; fi if test "$enable_m32" = yes then ff_m32=-m32 { $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 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="$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 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 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 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 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 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 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 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 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 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 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 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 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";; *) 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 # ------------------------------ # 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 "$ff_win32" = yes -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'` # 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 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" ff_MPI_INCLUDE="-I'$ff_MPI_INCLUDE_DIR' '-D_MSC_VER' '-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" 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 ff_MPI_INCLUDE="$with_mpiinc" 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 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 #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 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 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= 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 -f $ff_mkl_root/lib/$ff_mkl_arch/libmkl_rt.a ; then mkl_blas=rt mkk_lapack=rt ff_mkl_mlt="-L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_rt -lmkl_intel_thread -lmkl_core -liomp5 -lpthread" ff_mkl_blas="-L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_rt -lmkl_sequential -lmkl_core -liomp5 -lpthread" ff_mkl_lapack="-L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_rt -lmkl_sequential -lmkl_core -liomp5 -lpthread" else if test -f $ff_mkl_root/lib/$ff_mkl_arch/libmkl_lapack.a ; then ff_mkl_mlt="-L$ff_mkl_root/lib/$ff_mkl_arch -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_root/lib/$ff_mkl_arch -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="-Wl,--start-group -L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_${ff_mkl_cc}${ff_mkl_lp} -lmkl_intel${ff_mkl_lp} -lmkl_intel_thread -lmkl_core -lmkl_intel_thread -liomp5 -Wl,--end-group -lm -lpthread" ff_mkl_blas="-Wl,--start-group -L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_${ff_mkl_cc}${ff_mkl_lp} -lmkl_intel${ff_mkl_lp} -lmkl_sequential -lmkl_core -lmkl_sequential -Wl,--end-group -lm -lpthread" ff_mkl_lapack="$ff_mkl_blas" fi fi ff_mkl_scalapack="-L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_blacs${ff_mkl_mpi}${ff_mkl_lp} -lmkl_scalapack${ff_mkl_lp} " ff_mkl_blacs="-L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_blacs${ff_mkl_mpi}${ff_mkl_lp} -lmkl_scalapack${ff_mkl_lp}" ff_blas_ok=yes ff_lapack_ok=yes ff_blas_libs="$ff_mkl_blas" 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 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 vecLib" "$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 ff_blas_libs="-L${curdir}/download/blas/OpenBLAS -lopenblas" 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 if test "$OS" = Windows_NT then ff_static_lib=lib else ff_static_lib=a fi FF_STATIC_LIB=$ff_static_lib 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 vecLib/cblas.h do : ac_fn_cxx_check_header_mongrel "$LINENO" "vecLib/cblas.h" "ac_cv_header_vecLib_cblas_h" "$ac_includes_default" if test "x$ac_cv_header_vecLib_cblas_h" = xyes; then : cat >>confdefs.h <<_ACEOF #define HAVE_VECLIB_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_libs 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;} DOWNLOAD_ARPACK=arpack 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" if test "$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 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 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 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 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 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 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 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 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 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 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 # 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 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 else # no specific directives for package fflapack, activate automatic download TOOL_COMPILE_fflapack=fflapack enable_fflapack_download=yes 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 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 else # no specific directives for package hips, activate automatic download TOOL_COMPILE_hips=hips enable_hips_download=yes 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 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 else # no specific directives for package ipopt, activate automatic download TOOL_COMPILE_ipopt=ipopt enable_ipopt_download=yes 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 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 else # no specific directives for package lapack, activate automatic download TOOL_COMPILE_lapack=lapack enable_lapack_download=yes fi # Check whether --enable-metis was given. if test "${enable_metis+set}" = set; then : enableval=$enable_metis; fi if test "$enable_metis" = "no" then TOOL_COMPILE_metis="" TOOL_DYLIB_metis="" else TOOL_COMPILE_metis=metis TOOL_DYLIB_metis=metis.$DYLIB_SUFFIX fi # Also allow to disable the download of one tool if it is already locally installed # Check whether --with-metis_include was given. if test "${with_metis_include+set}" = set; then : withval=$with_metis_include; fi # Check whether --with-metis_ldflags was given. if test "${with_metis_ldflags+set}" = set; then : withval=$with_metis_ldflags; fi if test "$with_metis_include" != "" || test "$with_metis_ldflags" != "" then # some directives have been specified, use them instead of downloading if test -z "$ff_where_lib_conf_metis" ; then echo "metis LD $with_metis_ldflags" >>$ff_where_lib_conf test -n "$with_metis_include" && echo "metis INCLUDE $with_metis_include " >>$ff_where_lib_conf ff_where_lib_conf_metis=1 { $as_echo "$as_me:${as_lineno-$LINENO}: ++ add metis : $with_metis_ldflags $with_metis_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: ++ add metis : $with_metis_ldflags $with_metis_include in $ff_where_lib_conf \"" >&6;} else { $as_echo "$as_me:${as_lineno-$LINENO}: -- do not add metis : $with_metis_ldflags $with_metis_include in $ff_where_lib_conf \"" >&5 $as_echo "$as_me: -- do not add metis : $with_metis_ldflags $with_metis_include in $ff_where_lib_conf \"" >&6;} fi TOOL_COMPILE_metis="" enable_metis_download=no else # no specific directives for package metis, activate automatic download TOOL_COMPILE_metis=metis enable_metis_download=yes 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 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 else # no specific directives for package mmg3d, activate automatic download TOOL_COMPILE_mmg3d=mmg3d enable_mmg3d_download=yes 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 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 else # no specific directives for package mshmet, activate automatic download TOOL_COMPILE_mshmet=mshmet enable_mshmet_download=yes 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" 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 else # no specific directives for package mumps, activate automatic download TOOL_COMPILE_mumps=mumps enable_mumps_download=yes 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 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 else # no specific directives for package mumps_seq, activate automatic download TOOL_COMPILE_mumps_seq=mumps-seq enable_mumps_seq_download=yes 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 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 else # no specific directives for package nlopt, activate automatic download TOOL_COMPILE_nlopt=nlopt enable_nlopt_download=yes 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 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 else # no specific directives for package parmetis, activate automatic download TOOL_COMPILE_parmetis=parmetis enable_parmetis_download=yes 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 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 else # no specific directives for package parms, activate automatic download TOOL_COMPILE_parms=parms enable_parms_download=yes 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" 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 else # no specific directives for package pastix, activate automatic download TOOL_COMPILE_pastix=pastix enable_pastix_download=yes 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 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 else # no specific directives for package pipe, activate automatic download TOOL_COMPILE_pipe=pipe enable_pipe_download=yes 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 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 else # no specific directives for package scotch, activate automatic download TOOL_COMPILE_scotch=scotch enable_scotch_download=yes 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 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 else # no specific directives for package superlu, activate automatic download TOOL_COMPILE_superlu=superlu enable_superlu_download=yes 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" 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 else # no specific directives for package superludist, activate automatic download TOOL_COMPILE_superludist=superludist enable_superludist_download=yes 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 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 else # no specific directives for package umfpack, activate automatic download TOOL_COMPILE_umfpack=umfpack enable_umfpack_download=yes 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 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 else # no specific directives for package yams, activate automatic download TOOL_COMPILE_yams=yams enable_yams_download=yes 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 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 else # no specific directives for package pipe, activate automatic download TOOL_COMPILE_pipe=pipe enable_pipe_download=yes 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="../src/nw/FreeFem++" 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" 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 /*)e cho "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 /*)e cho "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 /*)e cho "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 /*)e cho "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 /*)e cho "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 /*)e cho "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 /*)e cho "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 /*)e cho "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 /*)e cho "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 /*)e cho "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. */ #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 -- "" || $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 /*)e cho "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. */ #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 -- "" || $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 /*)e cho "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 /*)e cho "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 /*)e cho "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 /*)e cho "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 /*)e cho "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 /*)e cho "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 /*)e cho "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_gsl" ; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking check gsl" >&5 $as_echo_n "checking check gsl... " >&6; } ff_save_libs=$LIBS LIBS="$LIBS -lgsl -lgslcblas -lm " 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 "gsl LD -lgsl -lgslcblas -lm" >>$ff_where_lib_conf ff_WHERE_INC=`$as_dirname -- "gsl/gsl_sf.h" || $as_expr X"gsl/gsl_sf.h" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"gsl/gsl_sf.h" : 'X\(//\)[^/]' \| \ X"gsl/gsl_sf.h" : 'X\(//\)$' \| \ X"gsl/gsl_sf.h" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"gsl/gsl_sf.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 /*)e cho "gsl 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_gsl=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 /*)e cho "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 /*)e cho "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 # FFCS - 27/10/11 - Some extra conditionals for things that do not work on certain systems (eg MPI libraries under # Windows) # remove gsl if not find ... FK if test "$ff_where_lib_conf_gsl" == 1 -a -z "$enable_gsl" ; then enable_gsl=no; fi; if test "$ff_where_lib_conf_mkl" == 1 -a -z "$enable_mkl" ; then enable_pardiso=no; 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 NewSolver.$DYLIB_SUFFIX" 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 else # no specific directives for package gsl, activate automatic download TOOL_COMPILE_gsl=gsl enable_gsl_download=yes 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 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 else # no specific directives for package pardiso, activate automatic download TOOL_COMPILE_pardiso=pardiso enable_pardiso_download=yes fi if test "$OS" = Windows_NT; then FFCS_WINDOWS_TRUE= FFCS_WINDOWS_FALSE='#' else FFCS_WINDOWS_TRUE='#' FFCS_WINDOWS_FALSE= 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.26-2, 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.26-2 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}: 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 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.26-2/configure.ac000644 000767 000767 00000161162 12245612756 015103 0ustar00hecht000000 000000 # Configuration script using Automake + Autoconf for FreeFem++ # ------------------------------------------------------------ # 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.26-2,hecht@ann.jussieu.fr,freefem++) dnl : ${CFLAGS=""} dnl : ${CXXFLAGS=""} dnl : ${FCFLAGS=""} dnl : ${FFLAGS=""} AC_PREREQ(2.50) dnl for AC_LANG_CASE 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 /*)e cho "$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++) AC_CHECK_PROG(ff_m4,m4,yes,no) AC_CHECK_PROG(ff_bison,bison,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 " in *no*) AC_MSG_NOTICE([ to install missing package under debian or ubuntu, try: sudo apt-get install m4 bison patch cmake ]) AC_MSG_ERROR([ Sorry missing m4,bison,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 AC_PROG_FC(gfortran f90 xlf90 g95 gfortran-mp-4.4) AC_PROG_F77(gfortran f90 xlf xlf90 g95 f77 fort77 "$FC" 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="") 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()). if test $enable_ffcs = yes then AC_SUBST(FFMETIS_CFLAGS,"-D__VC__") else AC_SUBST(FFMETIS_CFLAGS,"-D__VC__ -D_MSC_VER") fi # 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) 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) # ------------------------------ # 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,...)])) #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 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= 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 -f $ff_mkl_root/lib/$ff_mkl_arch/libmkl_rt.a ; then mkl_blas=rt mkk_lapack=rt ff_mkl_mlt="-L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_rt -lmkl_intel_thread -lmkl_core -liomp5 -lpthread" ff_mkl_blas="-L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_rt -lmkl_sequential -lmkl_core -liomp5 -lpthread" ff_mkl_lapack="-L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_rt -lmkl_sequential -lmkl_core -liomp5 -lpthread" else if test -f $ff_mkl_root/lib/$ff_mkl_arch/libmkl_lapack.a ; then ff_mkl_mlt="-L$ff_mkl_root/lib/$ff_mkl_arch -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_root/lib/$ff_mkl_arch -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="-Wl,--start-group -L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_${ff_mkl_cc}${ff_mkl_lp} -lmkl_intel${ff_mkl_lp} -lmkl_intel_thread -lmkl_core -lmkl_intel_thread -liomp5 -Wl,--end-group -lm -lpthread" ff_mkl_blas="-Wl,--start-group -L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_${ff_mkl_cc}${ff_mkl_lp} -lmkl_intel${ff_mkl_lp} -lmkl_sequential -lmkl_core -lmkl_sequential -Wl,--end-group -lm -lpthread" ff_mkl_lapack="$ff_mkl_blas" fi fi ff_mkl_scalapack="-L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_blacs${ff_mkl_mpi}${ff_mkl_lp} -lmkl_scalapack${ff_mkl_lp} " ff_mkl_blacs="-L$ff_mkl_root/lib/$ff_mkl_arch -lmkl_blacs${ff_mkl_mpi}${ff_mkl_lp} -lmkl_scalapack${ff_mkl_lp}" ff_blas_ok=yes ff_lapack_ok=yes ff_blas_libs="$ff_mkl_blas" 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) 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 vecLib" "$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 ff_blas_libs="-L${curdir}/download/blas/OpenBLAS -lopenblas" 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) if test "$OS" = Windows_NT then ff_static_lib=lib else ff_static_lib=a fi AC_SUBST(FF_STATIC_LIB,$ff_static_lib) 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(vecLib/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_libs) 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) AC_SUBST(DOWNLOAD_ARPACK,arpack) 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" if test "$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([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) 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 else # no specific directives for package $1, activate automatic download AC_SUBST([TOOL_COMPILE_$1],ifelse($3,,$1,$3)) enable_$1_download=yes 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) fi # Also allow to disable the download of one tool if it is already locally installed TOOL_PARAMETERS($1,$2,$3) ]) 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(metis,metis.$DYLIB_SUFFIX) TOOL_DISABLE(mmg3d,mmg3d-v4.0.$DYLIB_SUFFIX) TOOL_DISABLE(mshmet,mshmet.$DYLIB_SUFFIX) TOOL_DISABLE(mumps,"MUMPS_FreeFem.$DYLIB_SUFFIX MUMPS.$DYLIB_SUFFIX") TOOL_DISABLE(mumps_seq,MUMPS_seq.$DYLIB_SUFFIX,mumps-seq) TOOL_DISABLE(nlopt,ff-NLopt.$DYLIB_SUFFIX) 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,"../src/nw/FreeFem++") 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" 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],[]], [[ptscotch],[-lptscotch -lptscotcherr],[]], [[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],[],[]], [[gsl],[-lgsl -lgslcblas -lm],[gsl/gsl_sf.h],[]], [[parms],[-lparms -litsol -llapack -lblas -lm],[],[]], [[tetgen],[-ltet],[tetgen.h],[]], ] ) # FFCS - 27/10/11 - Some extra conditionals for things that do not work on certain systems (eg MPI libraries under # Windows) # remove gsl if not find ... FK if test "$ff_where_lib_conf_gsl" == 1 -a -z "$enable_gsl" ; then enable_gsl=no; fi; if test "$ff_where_lib_conf_mkl" == 1 -a -z "$enable_mkl" ; then enable_pardiso=no; fi; TOOL_DISABLE(gsl,"gsl.$DYLIB_SUFFIX NewSolver.$DYLIB_SUFFIX") TOOL_DISABLE(pardiso,PARDISO.$DYLIB_SUFFIX) AM_CONDITIONAL([FFCS_WINDOWS],[test "$OS" = Windows_NT]) # 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([ 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 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.26-2/COPYING000644 000767 000767 00000001751 11406142250 013626 0ustar00hecht000000 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.26-2/COPYRIGHT000644 000767 000767 00000045071 12167254041 014100 0ustar00hecht000000 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.26-2/copysharedlibs.sh000755 000767 000767 00000000715 11406142255 016151 0ustar00hecht000000 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.26-2/crimson-freefem++.zip000644 000767 000767 00000004006 11406142255 016527 0ustar00hecht000000 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.26-2/depcomp000755 000767 000767 00000033052 11406142255 014154 0ustar00hecht000000 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.26-2/DOC/000755 000767 000767 00000000000 12245613627 013211 5ustar00hecht000000 000000 freefem++-3.26-2/download/000755 000767 000767 00000000000 12245613624 014410 5ustar00hecht000000 000000 freefem++-3.26-2/edp.nedit000644 000767 000767 00000004247 11406142255 014400 0ustar00hecht000000 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.26-2/examples++/000755 000767 000767 00000000000 12245613626 014547 5ustar00hecht000000 000000 freefem++-3.26-2/examples++-3d/000755 000767 000767 00000000000 12245613627 015054 5ustar00hecht000000 000000 freefem++-3.26-2/examples++-bug/000755 000767 000767 00000000000 12245613627 015323 5ustar00hecht000000 000000 freefem++-3.26-2/examples++-chapt3/000755 000767 000767 00000000000 12245613627 015730 5ustar00hecht000000 000000 freefem++-3.26-2/examples++-eigen/000755 000767 000767 00000000000 12245613626 015634 5ustar00hecht000000 000000 freefem++-3.26-2/examples++-load/000755 000767 000767 00000000000 12245613626 015464 5ustar00hecht000000 000000 freefem++-3.26-2/examples++-mpi/000755 000767 000767 00000000000 12245613627 015333 5ustar00hecht000000 000000 freefem++-3.26-2/examples++-other/000755 000767 000767 00000000000 12245613627 015667 5ustar00hecht000000 000000 freefem++-3.26-2/examples++-tutorial/000755 000767 000767 00000000000 12245613626 016410 5ustar00hecht000000 000000 freefem++-3.26-2/examples-bamg/000755 000767 000767 00000000000 12245613623 015322 5ustar00hecht000000 000000 freefem++-3.26-2/FreeFem++-CoCoa000755 000767 000767 00000002603 12243646130 015145 0ustar00hecht000000 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.26-2/FreeFem++.mcp000755 000767 000767 00000474631 11406142255 014756 0ustar00hecht000000 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.26-2/freefem++.spec000644 000767 000767 00000004563 12167254041 015221 0ustar00hecht000000 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.26-2/HISTORY000644 000767 000767 00001420330 12037224676 013674 0ustar00hecht000000 000000 changeset: 2554:43560825cafe tag: tip user: Frederic Hecht date: Wed Oct 10 15:21:51 2012 +0200 summary: correct pipe.edp example to run under windows. changeset: 2553:395f577c1a69 user: Frederic Hecht date: Mon Oct 08 11:53:33 2012 +0900 summary: add pipe plugin to link with other soft changeset: 2552:db4af2db147e user: Frederic Hecht date: Sun Oct 07 14:11:44 2012 +0900 summary: do small coorection of windows changeset: 2551:d32ffb11bec9 user: Frederic Hecht date: Sun Oct 07 11:18:26 2012 +0900 summary: coorect pb to set C io under winder changeset: 2550:f3986a910f80 user: Frederic Hecht date: Sat Oct 06 22:34:10 2012 +0900 summary: type changeset: 2549:f6229d0989bb user: Frederic Hecht date: Sat Oct 06 22:30:02 2012 +0900 summary: correct mumps compilation 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 changeset: 2547:1626cbdfe5d6 user: Frederic Hecht date: Sat Oct 06 10:51:50 2012 +0900 summary: coorect typo changeset: 2546:7a7fba157b77 user: Frederic Hecht date: Sat Oct 06 10:50:08 2012 +0900 summary: add option to remove console output on windows changeset: 2545:b192e8d7cbd3 user: Frederic Hecht date: Sat Oct 06 10:29:16 2012 +0900 summary: correct thing of windows porting changeset: 2544:1b485471f601 user: Frederic Hecht date: Thu Oct 04 16:13:47 2012 +0200 summary: coorect pb compile windows changeset: 2543:b0e5ed55fcb8 user: Frederic Hecht date: Wed Oct 03 18:34:29 2012 +0200 summary: correct mmg3d with new version changeset: 2542:a2661dc3cf87 user: Frederic Hecht date: Wed Oct 03 15:01:12 2012 +0200 summary: correct pb with drawbdmesh ( not compile now), 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 changeset: 2540:7fcb20950af8 user: Frederic Hecht date: Wed Sep 26 15:31:46 2012 +0200 summary: remove drawbdmesh on windows changeset: 2539:3646196ba7b4 user: Frederic Hecht date: Tue Sep 25 13:16:23 2012 +0200 summary: A left scalar mul with formal arry. changeset: 2538:004c3ce519db user: Frederic Hecht date: Fri Sep 21 14:52:11 2012 +0200 summary: try a build 3.20 version changeset: 2537:4ea423174745 user: Frederic Hecht date: Fri Sep 21 11:37:23 2012 +0200 summary: add levelset integral in 2d.. changeset: 2536:3df0231f5788 user: Frederic Hecht date: Wed Sep 19 15:55:46 2012 +0200 summary: coorect cout changeset: 2535:1813e516c73c user: Frederic Hecht date: Wed Sep 19 15:49:51 2012 +0200 summary: correct isoline.cpp hard ... changeset: 2534:d63f9b0d6a90 user: Frederic Hecht date: Tue Sep 18 21:17:21 2012 +0200 summary: correct isoline.cpp bug some time .... changeset: 2533:9a0f4ba5bc83 user: Frederic Hecht date: Wed Sep 05 22:33:04 2012 +0200 summary: do coorect off clang++ compiler changeset: 2532:7268da0a32dd user: Frederic Hecht date: Wed Sep 05 21:59:44 2012 +0200 summary: correct big problem with clang++ compiler ... changeset: 2531:bf616e104e58 user: Frederic Hecht date: Wed Sep 05 21:56:56 2012 +0200 summary: coorect pb with clang compile, verif strange.. 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. changeset: 2529:4603f7ce0737 user: Frederic Hecht date: Tue Sep 04 16:41:21 2012 +0200 summary: clang next step. changeset: 2528:18d5c72b3f8b user: Frederic Hecht date: Tue Sep 04 10:32:46 2012 +0200 summary: do correct for clang compiler changeset: 2527:061c058bf92d user: Frederic Hecht date: Mon Sep 03 16:18:48 2012 +0200 summary: correct for c++11 changeset: 2526:47944725e009 user: Frederic Hecht date: Tue Aug 28 14:21:56 2012 +0200 summary: update README macos 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 changeset: 2524:8fde78f05ac0 user: Frederic Hecht date: Mon Aug 27 16:03:36 2012 +0200 summary: remove print in sparse solver changeset: 2523:d6c07fd2ec36 user: Frederic Hecht date: Sun Aug 26 21:27:19 2012 +0200 summary: add missing operator ?: of bool changeset: 2522:e5a90f5a7283 user: Frederic Hecht date: Thu Aug 16 09:47:15 2012 +0200 summary: revome print ... changeset: 2521:91006696c311 user: Frederic Hecht date: Tue Aug 14 21:17:02 2012 +0200 summary: correct mistake find by P. Jolivet. changeset: 2520:ef81308ec4f1 user: Frederic Hecht date: Sun Aug 12 22:07:52 2012 +0200 summary: cooorect automatic seach in configire (P Jolivet). changeset: 2519:4422559d360a user: Frederic Hecht date: Mon Aug 06 23:12:27 2012 +0200 summary: add comment of my installation changeset: 2518:27d04b01bb9d user: Frederic Hecht date: Mon Aug 06 00:14:04 2012 +0200 summary: correct Superludist with g++ v 4.8 changeset: 2517:08658feae475 user: Frederic Hecht date: Sun Aug 05 23:37:08 2012 +0200 summary: forget files 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-> changeset: 2515:68577323c46d user: Frederic Hecht date: Sun Aug 05 15:17:51 2012 +0200 summary: change mac compiler gcc version 4.8.0 changeset: 2514:ce08661de7d5 user: Frederic Hecht date: Thu Jul 12 14:27:34 2012 +0200 summary: add example changeset: 2513:efd3db094bcf user: Frederic Hecht date: Thu Jul 12 14:00:47 2012 +0200 summary: add imax, imam, correct sctoch interface not // changeset: 2512:cd465304bca9 user: Frederic Hecht date: Wed Jun 13 20:04:15 2012 +0200 summary: add compile of shell changeset: 2511:250772fdd061 user: Frederic Hecht date: Wed Jun 13 20:00:36 2012 +0200 summary: add shell/unix interface 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] ... changeset: 2509:4628b688eeaf user: Frederic Hecht date: Thu Jun 07 15:12:35 2012 +0200 summary: add missing include in some computer unistd.h changeset: 2508:031e9c676174 user: Frederic Hecht date: Thu Jun 07 08:16:38 2012 +0200 summary: correct mshmet makefile to force the recompilation changeset: 2507:1839c38ea7dc user: Frederic Hecht date: Thu Jun 07 08:06:55 2012 +0200 summary: chnge version to 3.19-2 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. changeset: 2505:95e33e458008 user: Frederic Hecht date: Wed May 30 14:13:26 2012 +0200 summary: correct typo in font size in postcript interface changeset: 2504:f2cdbadf6faf user: Frederic Hecht date: Tue May 22 21:15:30 2012 +0200 summary: correct clean part of mshmet makefile + add changeset: 2503:bee48e40935e user: Frederic Hecht date: Tue May 15 11:48:05 2012 +0200 summary: correct missing const in qf11to25.cpp 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 changeset: 2501:f20a2f3c7bd6 user: Frederic Hecht date: Mon May 14 21:04:26 2012 +0200 summary: set fftw to version 3.3.2 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 changeset: 2499:de4c315dad33 user: Frederic Hecht date: Wed May 09 21:11:04 2012 +0200 summary: pass to version 3.19-1 changeset: 2498:7ecf46eb253d user: Frederic Hecht date: Wed May 09 21:06:07 2012 +0200 summary: add Ernesto Aranda change ... changeset: 2497:49f99f157b3c user: Frederic Hecht date: Mon May 07 10:27:41 2012 +0200 summary: coorect typo = -> != in configure (mkl sgi) 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 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) changeset: 2494:d7658c0f681b user: Frederic Hecht date: Thu May 03 18:28:44 2012 +0200 summary: add correct in MUMPS mpi solver changeset: 2493:c5124bde5bc5 user: Frederic Hecht date: Thu May 03 11:01:00 2012 +0200 summary: remove cmake de configure changeset: 2492:83094b26702f user: Frederic Hecht date: Thu May 03 11:00:01 2012 +0200 summary: add count pour ptr in CheckPtr.cpp changeset: 2491:463c4c448187 user: Frederic Hecht date: Tue Apr 24 13:25:56 2012 +0200 summary: try to count memery pointeur changeset: 2490:66be2ba0ba65 user: Frederic Hecht date: Mon Apr 23 23:08:13 2012 +0200 summary: change version of superlu. 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. changeset: 2488:76e28b509475 user: Frederic Hecht date: Fri Apr 20 16:51:03 2012 +0200 summary: correct atexit problem in mmg3 v4 .. changeset: 2487:cb2752aee207 user: Frederic Hecht date: Fri Apr 20 15:40:23 2012 +0200 summary: correct Interface of Ipopt (ff-Ipopt) changeset: 2486:04bbadc57f58 user: Frederic Hecht date: Fri Apr 20 14:16:51 2012 +0200 summary: carrect un set varable in mmage3d-v4 changeset: 2485:e83aa5d378f9 user: Frederic Hecht date: Fri Apr 20 12:03:38 2012 +0200 summary: coorect ff-Ipopt version changeset: 2484:90cf49c9fbb5 user: Frederic Hecht date: Fri Apr 20 11:33:36 2012 +0200 summary: coorect typo in innovation file changeset: 2483:baebf141d983 user: Frederic Hecht date: Fri Apr 20 09:27:57 2012 +0200 summary: update INNOVATION file changeset: 2482:5ede79cd270b user: Frederic Hecht date: Fri Apr 20 09:21:18 2012 +0200 summary: correct typo changeset: 2481:0c075c537334 user: Frederic Hecht date: Fri Apr 20 08:48:58 2012 +0200 summary: add isNaN,IsInf,IsNormal FP fonction and changeset: 2480:290972213b56 user: Frederic Hecht date: Thu Apr 19 22:58:51 2012 +0200 summary: add a true scotch example changeset: 2479:c0c3c75dd20a user: Frederic Hecht date: Thu Apr 19 18:46:00 2012 +0200 summary: add sort of integer array changeset: 2478:08b71cf34320 user: Frederic Hecht date: Thu Apr 19 17:17:10 2012 +0200 summary: add missing file changeset: 2477:551aa5767d7f user: Frederic Hecht date: Thu Apr 19 17:12:43 2012 +0200 summary: coorect header of plugin changeset: 2476:a6258a786803 user: Frederic Hecht date: Thu Apr 19 16:46:43 2012 +0200 summary: add scotch interface thanks to P. Jolivet changeset: 2475:b7f9353707c0 user: Frederic Hecht date: Thu Apr 19 16:34:39 2012 +0200 summary: Pour P. Jolivet, changeset: 2474:e507d135fbf4 user: Frederic Hecht date: Thu Apr 19 16:28:28 2012 +0200 summary: correct bug in macro with operator .*= and ./= 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 changeset: 2472:f7c9fbfee29e user: Frederic Hecht date: Sun Apr 15 22:27:49 2012 +0200 summary: correct mmg3d new interface. 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 changeset: 2470:be230cbc9bb1 user: Frederic Hecht date: Wed Apr 11 22:46:11 2012 +0200 summary: update doc with isoline example changeset: 2469:7b55a13f44bf user: Frederic Hecht date: Wed Apr 11 18:15:57 2012 +0200 summary: correct type in edp files changeset: 2468:cb455028d3bc user: Frederic Hecht date: Thu Apr 05 17:59:05 2012 +0200 summary: correct pb plot in 3d-lemen;edp example changeset: 2467:a4495a14cc6f user: Frederic Hecht date: Thu Apr 05 17:41:19 2012 +0200 summary: correct Makefile for dist changeset: 2466:c1c7515b599d user: Frederic Hecht date: Thu Apr 05 17:38:21 2012 +0200 summary: remove assert of generate surface mesh ??? changeset: 2465:adf7a32dec37 user: Frederic Hecht date: Thu Apr 05 17:36:08 2012 +0200 summary: add new Ipopt example 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 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 changeset: 2462:43d891de7b5c user: Frederic Hecht date: Fri Mar 30 13:52:21 2012 +0200 summary: update IPOPT interface changeset: 2461:ff9197c7215e user: Frederic Hecht date: Thu Mar 22 19:02:18 2012 +0100 summary: forget all.edp (automatical rebuild) changeset: 2460:5f0193ae54c8 user: Frederic Hecht date: Thu Mar 22 18:59:23 2012 +0100 summary: coorect install plugin changeset: 2459:33407ff589c1 user: Frederic Hecht date: Thu Mar 22 18:52:47 2012 +0100 summary: add missing file changeset: 2458:da832a4533ec user: Frederic Hecht date: Thu Mar 22 18:51:32 2012 +0100 summary: romve use file changeset: 2457:a70d6470d341 user: Frederic Hecht date: Thu Mar 22 18:18:18 2012 +0100 summary: correct typo changeset: 2456:660e36d76368 user: Frederic Hecht date: Thu Mar 22 18:14:56 2012 +0100 summary: add missing file changeset: 2455:d1c7eb0f6226 user: Frederic Hecht date: Thu Mar 22 17:48:02 2012 +0100 summary: coorect FFLAGS in ippot changeset: 2454:c7e70cac0ced user: Frederic Hecht date: Thu Mar 22 17:45:23 2012 +0100 summary: correct ipopt fortran flags changeset: 2453:fa1d39ecf8c5 user: Frederic Hecht date: Thu Mar 22 17:00:18 2012 +0100 summary: correct chanhe of ff-IpOpt in ff-Ipopt changeset: 2452:603891d1341f user: Frederic Hecht date: Thu Mar 22 16:58:37 2012 +0100 summary: correcrt Ipot name changeset: 2451:abcfed2f161a user: Frederic Hecht date: Thu Mar 22 15:24:19 2012 +0100 summary: remove build file changeset: 2450:fd47a9cb93e6 user: Frederic Hecht date: Thu Mar 22 14:01:53 2012 +0100 summary: correct missing CFLAGS compile flige in ipopt changeset: 2449:9c4f3a731d8f user: Frederic Hecht date: Thu Mar 15 17:03:46 2012 +0100 summary: update freeyams versio changeset: 2448:57268fd78d95 user: Frederic Hecht date: Thu Mar 15 16:22:26 2012 +0100 summary: correct ipopt changeset: 2447:648085c768e2 user: Frederic Hecht date: Thu Mar 15 15:41:31 2012 +0100 summary: carrection iptop interface changeset: 2446:db7e1719d41d user: Frederic Hecht date: Wed Mar 14 10:03:06 2012 +0100 summary: coorect typo the WHERE file building changeset: 2445:9652b407c4d4 user: Frederic Hecht date: Wed Mar 14 09:40:38 2012 +0100 summary: correct msh3.cpp see INNOVATION changeset: 2444:0912ecf5b7b6 user: Frederic Hecht date: Tue Mar 13 19:22:46 2012 +0100 summary: correct type error changeset: 2443:f73f7abb9628 user: Frederic Hecht date: Mon Mar 12 20:42:20 2012 +0100 summary: add Ipopt interface, seems workinging changeset: 2442:18c51dd3fae0 user: Frederic Hecht date: Fri Mar 09 22:15:39 2012 +0100 summary: add nex example changeset: 2441:d857f8111e76 user: Frederic Hecht date: Fri Mar 09 22:12:33 2012 +0100 summary: add IpOpt interface changeset: 2440:9811138f1bc7 user: Frederic Hecht date: Fri Mar 09 22:02:20 2012 +0100 summary: add Ipopt interface 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 changeset: 2438:cc334b6ba942 user: Frederic Hecht date: Wed Mar 07 20:31:44 2012 +0100 summary: add -mkl flgs in configure in test .. 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 changeset: 2436:d8c7a95bab01 user: Frederic Hecht date: Tue Mar 06 23:13:13 2012 +0100 summary: add new example changeset: 2435:e9f77853f86a user: Frederic Hecht date: Tue Mar 06 22:57:22 2012 +0100 summary: add subarrey of full matrix. changeset: 2434:44e45a467771 user: Frederic Hecht date: Tue Mar 06 22:06:47 2012 +0100 summary: add new type of array , array of array. changeset: 2433:ff330cc9ed2a user: Frederic Hecht date: Fri Feb 24 17:43:14 2012 +0100 summary: add ipopt download changeset: 2432:6dd56733d650 user: Frederic Hecht date: Thu Feb 23 13:07:28 2012 +0100 summary: add install of libphread-2.dd or win32 changeset: 2431:2fbea8d0c565 user: Frederic Hecht date: Thu Feb 23 12:07:08 2012 +0100 summary: add pthread in mpi mumps 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 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 changeset: 2428:9c218b0575fc user: Frederic Hecht date: Wed Feb 22 22:16:57 2012 +0100 summary: add MUMPS seq pluging changeset: 2427:e714f05e8c68 user: Frederic Hecht date: Mon Feb 20 10:02:23 2012 +0100 summary: add tag + correct missing file in windows distributiuon changeset: 2426:16116189f9fc user: Frederic Hecht date: Mon Feb 20 10:01:42 2012 +0100 summary: Added tag 3.18-1 for changeset 7a11ffa1f26e changeset: 2425:7a11ffa1f26e tag: 3.18-1 user: Frederic Hecht date: Fri Feb 17 16:14:54 2012 +0100 summary: correct edp .. changeset: 2424:ff06d18097d3 user: Frederic Hecht date: Fri Feb 17 15:21:24 2012 +0100 summary: coorect install windows changeset: 2423:5dc5d4a44a0f user: Frederic Hecht date: Fri Feb 17 15:16:38 2012 +0100 summary: correct missing file in makefiles changeset: 2422:297b8d9f6034 user: Frederic Hecht date: Wed Feb 15 22:00:56 2012 +0100 summary: update doc changeset: 2421:fc00fdf10fc8 user: Frederic Hecht date: Wed Feb 15 21:32:56 2012 +0100 summary: continuing update changeset: 2420:6cf5db8c5b72 user: Frederic Hecht date: Wed Feb 15 21:29:17 2012 +0100 summary: add .im, .re of array..compile test changeset: 2419:56dc83bd98f5 user: Frederic Hecht date: Wed Feb 15 21:01:22 2012 +0100 summary: add re , operator in complex sparce matrix 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 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. changeset: 2416:17002f8ac1e6 user: Frederic Hecht date: Mon Feb 13 17:12:46 2012 +0100 summary: add comment in INNOVATION file changeset: 2415:99a84a69a476 user: Frederic Hecht date: Mon Feb 13 16:49:40 2012 +0100 summary: add error in case of probleme ith periodic changeset: 2414:7e01a75cf0a2 user: Frederic Hecht date: Wed Feb 08 18:02:06 2012 +0100 summary: add missing file changeset: 2413:7e1ce5867819 user: Frederic Hecht date: Wed Feb 08 18:01:07 2012 +0100 summary: add missing files changeset: 2412:1a9d248b0abe user: Frederic Hecht date: Wed Feb 08 17:57:12 2012 +0100 summary: add missing file changeset: 2411:313f2537e2f6 user: Frederic Hecht date: Wed Feb 08 17:52:21 2012 +0100 summary: add missing file changeset: 2410:f809aa7e43f9 user: Frederic Hecht date: Wed Feb 08 17:42:51 2012 +0100 summary: add missing files changeset: 2409:124a413008ed user: Frederic Hecht date: Wed Feb 08 16:34:17 2012 +0100 summary: correct Makefiles changeset: 2408:cbb20473adea user: Frederic Hecht date: Wed Feb 08 16:33:04 2012 +0100 summary: remove example without new adaptation schema 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 changeset: 2406:40df8192a994 user: Frederic Hecht date: Fri Jan 20 15:36:57 2012 +0100 summary: coorect scriot changeset: 2405:9f521b6ad9e9 user: Frederic Hecht date: Thu Jan 19 13:37:05 2012 +0100 summary: correct DOC changeset: 2404:5c0462ce1574 user: Frederic Hecht date: Thu Jan 19 09:54:05 2012 +0100 summary: add New example in Chap 3. 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) 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 changeset: 2401:64149fc11869 user: Frederic Hecht date: Wed Jan 18 21:34:52 2012 +0100 summary: correct file to compile with xcode 4.2 changeset: 2400:9506aca1ea28 tag: v3.18 user: Frederic Hecht date: Mon Jan 16 13:08:11 2012 +0100 summary: add line ininnovation changeset: 2399:153d0a5015bb user: Frederic Hecht date: Mon Jan 16 13:04:13 2012 +0100 summary: Correct NSprojection example changeset: 2398:2d9a79b70d5b user: Frederic Hecht date: Mon Jan 16 11:27:49 2012 +0100 summary: add redownload off mmg34 tar gz changeset: 2397:1fd0801dc393 user: Frederic Hecht date: Mon Jan 16 11:10:33 2012 +0100 summary: correct compile of mmg3d v4 changeset: 2396:f03a6f977499 user: Frederic Hecht date: Wed Jan 11 21:35:51 2012 +0100 summary: add missing file on windows changeset: 2395:5fcad65c5ece user: Frederic Hecht date: Wed Jan 11 21:04:00 2012 +0100 summary: passe to version 3.18 changeset: 2394:a8118bf9d0a5 user: Frederic Hecht date: Wed Jan 11 12:11:19 2012 +0100 summary: update isoline dll. changeset: 2393:d925ce8d8dd6 user: Frederic Hecht date: Tue Jan 10 21:08:06 2012 +0100 summary: correct mpigather changeset: 2392:03d927f3dda3 user: Frederic Hecht date: Tue Jan 10 20:50:00 2012 +0100 summary: correct parallelempi.cpp mpigather assert 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 changeset: 2390:b778cdbf73c1 user: Frederic Hecht date: Thu Dec 15 16:05:51 2011 +0100 summary: correct pb of offset in readmesh in ffglut 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 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) changeset: 2387:d3f7e78540eb user: Frederic Hecht date: Wed Nov 30 14:42:47 2011 +0100 summary: corret MPI problem changeset: 2386:1a638fa49fbe user: Frederic Hecht date: Thu Nov 17 15:12:11 2011 +0100 summary: correct BLACS interface ( mkl and debain case) 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 changeset: 2384:02fd8c5643f3 user: Frederic Hecht date: Wed Nov 16 22:10:38 2011 +0100 summary: correct mshmet 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) changeset: 2382:f661f9f8e47b user: Frederic Hecht date: Wed Nov 16 17:56:03 2011 +0100 summary: remove double symbloe in freeyam with meshlib changeset: 2381:5732efc58a03 user: Frederic Hecht date: Wed Nov 16 16:02:42 2011 +0100 summary: remove compress tools in scotch by default changeset: 2380:1f7181ed77e3 user: Frederic Hecht date: Wed Nov 16 11:39:39 2011 +0100 summary: correct mistake in ymas interface changeset: 2379:f671d72ac333 user: Frederic Hecht date: Wed Nov 16 11:09:26 2011 +0100 summary: uodate to last freeymas version changeset: 2378:b5cf0e99fbc4 user: Frederic Hecht date: Tue Nov 15 17:42:08 2011 +0100 summary: correct aprmetis and mmg3d opt version 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 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 changeset: 2375:0f35b35f0203 user: Frederic Hecht date: Tue Nov 08 22:26:08 2011 +0100 summary: add missing file 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) changeset: 2373:81725e52c648 user: Frederic Hecht date: Tue Nov 08 21:33:42 2011 +0100 summary: correct typo error and pdate the doc. changeset: 2372:729356646c52 user: Frederic Hecht date: Tue Nov 08 21:02:28 2011 +0100 summary: correct the new auto laod interface ... changeset: 2371:97802e3f5d5e user: Frederic Hecht date: Sun Nov 06 20:59:48 2011 +0100 summary: passe to versio 3.17 changeset: 2370:07ee613471d9 user: Frederic Hecht date: Sun Nov 06 15:46:21 2011 +0100 summary: coorect PB off pluging ( ok may be) changeset: 2369:3a017668777d user: Frederic Hecht date: Fri Nov 04 18:45:51 2011 +0100 summary: correct Typo error in multiple include defence .. changeset: 2368:72f8424630ee user: Frederic Hecht date: Fri Nov 04 16:54:48 2011 +0100 summary: up innovation 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 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 changeset: 2365:896119ddcba9 user: Frederic Hecht date: Wed Oct 26 21:50:31 2011 +0200 summary: correct missing changeset: 2364:6162056c2706 user: Frederic Hecht date: Wed Oct 26 13:27:13 2011 +0200 summary: pass to v 3.16-1 changeset: 2363:bf3e6531f554 user: Frederic Hecht date: Wed Oct 26 13:12:33 2011 +0200 summary: add missing file changeset: 2362:f38424524a39 user: Frederic Hecht date: Wed Oct 26 13:10:05 2011 +0200 summary: add patch of Marco Atzeri for cygwin changeset: 2361:392218d17485 user: Frederic Hecht date: Fri Oct 21 14:47:43 2011 +0200 summary: doc is 3.16-1 changeset: 2360:174539a666e8 user: Frederic Hecht date: Fri Oct 21 14:44:44 2011 +0200 summary: update doc S. Auliac (optim) changeset: 2359:e2bd8b52269f user: Frederic Hecht date: Fri Oct 21 14:17:20 2011 +0200 summary: MAJ INNOVATION changeset: 2358:539aa3bc4a1b user: Frederic Hecht date: Fri Oct 21 14:13:58 2011 +0200 summary: add mpi_cmaes lib and examples 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) changeset: 2356:2edd97964eeb user: Frederic Hecht date: Fri Oct 14 14:35:20 2011 +0200 summary: add truc to remove 2 init changeset: 2355:408618fc2d14 user: Frederic Hecht date: Thu Oct 13 23:09:39 2011 +0200 summary: correct auto load of mumps changeset: 2354:233a5a7f55c1 user: Frederic Hecht date: Thu Oct 13 23:07:31 2011 +0200 summary: correct pb of autoinitsfunct changeset: 2353:09b0580dda3a user: Frederic Hecht date: Wed Oct 12 15:01:36 2011 +0200 summary: add tool to automatique load changeset: 2352:4bf39e36e2aa user: Frederic Hecht date: Fri Oct 07 22:10:24 2011 +0200 summary: coorect pb of alloaction changeset: 2351:383e5c0deedb user: Frederic Hecht date: Fri Oct 07 21:17:54 2011 +0200 summary: change testio.edp ttestio.edp changeset: 2350:70f9874ad0e4 user: Frederic Hecht date: Fri Oct 07 17:42:22 2011 +0200 summary: coorect example changeset: 2349:b3c7905f858b user: Frederic Hecht date: Thu Oct 06 17:30:42 2011 +0200 summary: coorect type in mmg3v4 changeset: 2348:cade5380b91e user: Frederic Hecht date: Thu Oct 06 17:24:50 2011 +0200 summary: correct CFALGS changeset: 2347:70b2d6267d97 user: Frederic Hecht date: Thu Oct 06 16:55:39 2011 +0200 summary: correct typo error changeset: 2346:d48570028111 user: Frederic Hecht date: Thu Oct 06 13:19:02 2011 +0200 summary: correct typo error and warning changeset: 2345:ccd64b80d57f user: Frederic Hecht date: Thu Oct 06 12:52:17 2011 +0200 summary: try to bluid v 3.15 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.. 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 changeset: 2342:55e2323587af user: Frederic Hecht date: Wed Oct 05 14:44:47 2011 +0200 summary: correct pastix patch include (remove .. in patch file) 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] changeset: 2340:70404bc0a76f user: Frederic Hecht date: Thu Sep 29 21:48:05 2011 +0200 summary: correct Paul Cazeaux diff changeset: 2339:e9d61b12fae9 user: Frederic Hecht date: Thu Sep 29 19:25:21 2011 +0200 summary: correct install MacOSX changeset: 2338:6a620fc389e1 user: Frederic Hecht date: Thu Sep 29 13:55:16 2011 +0200 summary: add freefem++ laucher changeset: 2337:b6eca8cec8e8 user: Frederic Hecht date: Wed Sep 28 20:29:53 2011 +0200 summary: correc configure cmaek typo error changeset: 2336:f98beda3b2a9 user: Frederic Hecht date: Wed Sep 28 20:26:15 2011 +0200 summary: try to redo Freefem++.app changeset: 2335:d03364e04423 user: Frederic Hecht date: Tue Sep 27 18:23:44 2011 +0200 summary: correct metis makefile changeset: 2334:fe046f72fb0a user: Frederic Hecht date: Tue Sep 27 18:07:55 2011 +0200 summary: Added tag 3.14-1 for changeset 3d5d2f056b09 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 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). changeset: 2331:37137749da6e user: Frederic Hecht date: Tue Sep 27 15:24:10 2011 +0200 summary: correct metis download (version 5.0.1) changeset: 2330:a8aac61cf98b user: Frederic Hecht date: Thu Sep 22 09:26:49 2011 +0200 summary: coorect FreeFem++-CoCoa line 26: [: : integer expression expected changeset: 2329:43229386f981 user: Frederic Hecht date: Fri Sep 02 09:05:52 2011 +0200 summary: correct Missing WHERE buils changeset: 2328:9dc607125215 user: Frederic Hecht date: Fri Sep 02 08:57:54 2011 +0200 summary: add missing file changeset: 2327:6e2de6f927d5 user: Frederic Hecht date: Fri Sep 02 08:53:46 2011 +0200 summary: update innovation changeset: 2326:3ea8a0183313 user: Frederic Hecht date: Thu Sep 01 22:43:12 2011 +0200 summary: coorect interface with mmg3d verson 4 changeset: 2325:878e5c556d1e user: Frederic Hecht date: Thu Sep 01 22:40:33 2011 +0200 summary: coorect inferface with mmg3d version 4 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 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 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 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 changeset: 2320:8901cfb2463f user: Frederic Hecht date: Fri Aug 26 22:00:34 2011 +0200 summary: correct mpi exemple changeset: 2319:117a01a44f20 user: Frederic Hecht date: Fri Aug 26 21:38:55 2011 +0200 summary: correct allGather check 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 changeset: 2317:be0d2368a0f4 user: Frederic Hecht date: Fri Aug 26 21:08:19 2011 +0200 summary: correct missing return in WSEND changeset: 2316:8f502dfff22e user: Frederic Hecht date: Fri Aug 26 15:05:09 2011 +0200 summary: recorrect tetger clan makeifle changeset: 2315:cff15f3375e6 user: Frederic Hecht date: Fri Aug 26 15:01:16 2011 +0200 summary: do autoreconf changeset: 2314:dfe298c27b76 user: Frederic Hecht date: Fri Aug 26 14:57:05 2011 +0200 summary: restart of 3.14 version (big mistake yesterday) changeset: 2313:fda9929d138d user: Frederic Hecht date: Fri Aug 26 13:53:31 2011 +0200 summary: remobe -march=native (bug on allpe) changeset: 2312:3d541b3d75d1 user: Frederic Hecht date: Fri Aug 26 11:46:26 2011 +0200 summary: correct optim compile flags changeset: 2311:9a74f723f0ac user: Frederic Hecht date: Fri Aug 26 11:33:30 2011 +0200 summary: redo second problem changeset: 2310:bf083bb860bc user: Frederic Hecht date: Fri Aug 26 11:18:55 2011 +0200 summary: correct debug config flags 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 changeset: 2308:f01c1ce34eb3 user: Frederic Hecht date: Thu Aug 25 17:54:08 2011 +0200 summary: coorect defaul compile flags 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). changeset: 2306:f1321b98b61b user: Frederic Hecht date: Thu Aug 25 11:20:20 2011 +0200 summary: correct clean taget in Makefile changeset: 2305:4b313e53fd00 user: Frederic Hecht date: Thu Aug 25 09:31:50 2011 +0200 summary: Added tag 3.14 for changeset fbc48e130737 changeset: 2304:fbc48e130737 tag: 3.14 user: Frederic Hecht date: Thu Aug 25 09:30:45 2011 +0200 summary: and add -g in case of --enable-debug changeset: 2303:572e5649ecf2 user: Frederic Hecht date: Wed Aug 03 15:55:49 2011 +0200 summary: correct of lion os. changeset: 2302:0183fdbeab37 user: Frederic Hecht date: Wed Jul 06 11:36:12 2011 +0200 summary: see innovation changeset: 2301:5aeeb62cc314 user: Frederic Hecht date: Mon Jul 04 21:37:38 2011 +0200 summary: correct makefile changeset: 2300:5c0487b0b207 user: Frederic Hecht date: Thu Jun 30 23:12:35 2011 +0200 summary: correct typo changeset: 2299:b1bfdb1c8d4c user: Frederic Hecht date: Thu Jun 30 16:48:53 2011 +0200 summary: correct INNOVATION changeset: 2298:e8247822dc8f user: Frederic Hecht date: Thu Jun 30 16:21:48 2011 +0200 summary: correct hips solver typo arror in destructor changeset: 2297:8d0d89f8408a user: Frederic Hecht date: Thu Jun 30 11:17:09 2011 +0200 summary: pass to version 3.13-3 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 changeset: 2295:344cbb3584d8 user: Frederic Hecht date: Thu Jun 30 11:05:02 2011 +0200 summary: add missing file changeset: 2294:21c29dd8cb63 user: Frederic Hecht date: Thu Jun 30 11:00:03 2011 +0200 summary: coorect innovation file changeset: 2293:2a0706ac5c1b user: Frederic Hecht date: Thu Jun 30 10:57:28 2011 +0200 summary: coorect hips solver changeset: 2292:673e2af79b3b user: Frederic Hecht date: Thu Jun 30 09:32:00 2011 +0200 summary: correct HIPS solver changeset: 2291:d839c2fd8874 user: Frederic Hecht date: Wed Jun 29 09:30:24 2011 +0200 summary: upgrade INNOVATION file 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 changeset: 2289:3ed2fe0ff5bf user: Frederic Hecht date: Tue Jun 28 09:18:23 2011 +0200 summary: pass to version 3.13-2 changeset: 2288:70da8688792b user: Frederic Hecht date: Mon Jun 27 23:29:05 2011 +0200 summary: correct gibbs may be algo changeset: 2287:97bf00ff569f user: Frederic Hecht date: Mon Jun 27 22:54:04 2011 +0200 summary: fing a bug un gibbs algo dur dur changeset: 2286:447235cc1f35 user: Frederic Hecht date: Mon Jun 27 21:17:36 2011 +0200 summary: correct interpolation problem with periodic BC. changeset: 2285:fab78e8b1f74 user: Frederic Hecht date: Mon Jun 27 19:20:06 2011 +0200 summary: correct typo changeset: 2284:0f2ff71f4833 user: Frederic Hecht date: Mon Jun 27 19:14:22 2011 +0200 summary: add mem usage in UMFPACK solver output changeset: 2283:540832a7ce66 user: Frederic Hecht date: Mon Jun 27 10:31:44 2011 +0200 summary: add exemples examples++-tutorial/Laplace-RHS-Dirac.edp changeset: 2282:49c1c93356a0 user: Frederic Hecht date: Thu Jun 09 17:48:18 2011 +0200 summary: correct ambiguity in square func. changeset: 2281:a92f428fff7f user: Frederic Hecht date: Thu Jun 09 12:26:16 2011 +0200 summary: correct choix of mpimkl changeset: 2280:5aa51837cdb7 user: Frederic Hecht date: Tue Jun 07 20:32:50 2011 +0200 summary: correct install yams changeset: 2279:214e7ba93af3 user: Frederic Hecht date: Mon Jun 06 21:51:56 2011 +0200 summary: correct freeyams changeset: 2278:41c904b8660c user: Frederic Hecht date: Mon Jun 06 20:42:03 2011 +0200 summary: correct spuriou print changeset: 2277:fcaee41a91cb user: Frederic Hecht date: Mon Jun 06 19:07:24 2011 +0200 summary: correct freeyams.cpp LD process. changeset: 2276:1a6949ae0965 user: Frederic Hecht date: Mon May 30 15:16:17 2011 +0200 summary: add new example changeset: 2275:76e1708404c5 user: Frederic Hecht date: Fri May 27 14:40:04 2011 +0200 summary: correct typo in int blas type changeset: 2274:beae57ef5319 user: Frederic Hecht date: Fri May 27 14:36:03 2011 +0200 summary: correct int for blas variable .. changeset: 2273:3f2e931fffc3 user: Frederic Hecht date: Thu May 26 15:42:47 2011 +0200 summary: correct typo in doc. changeset: 2272:6ba83092a50b user: Frederic Hecht date: Thu May 26 15:15:01 2011 +0200 summary: go v 3.13 changeset: 2271:27fb12aa07ae user: Frederic Hecht date: Thu May 26 15:13:55 2011 +0200 summary: autoreconf changeset: 2270:93499395509f user: Frederic Hecht date: Thu May 26 15:11:13 2011 +0200 summary: update doc changeset: 2269:55460f8c273e user: Frederic Hecht date: Wed May 25 21:07:04 2011 +0200 summary: add final comment on Element_miaxte.cpp file 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 changeset: 2267:b1efdda0703b user: Frederic Hecht date: Tue May 24 17:16:27 2011 +0200 summary: add BDM1 and BDM1Ortho Finite element changeset: 2266:b73e6b532325 user: Frederic Hecht date: Fri May 20 16:47:08 2011 +0200 summary: in progress TD-NND 1 element changeset: 2265:696e7299da62 user: Frederic Hecht date: Fri May 20 09:46:32 2011 +0200 summary: end of validation for RT1 changeset: 2264:0512b6bb56db user: Frederic Hecht date: Fri May 20 09:09:16 2011 +0200 summary: correct RT1 and add RT1Ortho F.E. 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. changeset: 2262:13906a499616 user: Frederic Hecht date: Mon May 09 08:53:30 2011 +0200 summary: correct lapack changeset: 2261:3d579277e4ce user: Frederic Hecht date: Mon May 09 08:02:42 2011 +0200 summary: coorect lapack.cpp add full matrice multiplication changeset: 2260:39fb84c4949b user: Frederic Hecht date: Fri May 06 14:56:04 2011 +0200 summary: coorct lapack and New FE element changeset: 2259:a02b7f1a9c02 user: Frederic Hecht date: Thu May 05 15:47:08 2011 +0200 summary: add New finite in construction changeset: 2258:bcfcf356bb8c user: Frederic Hecht date: Thu Apr 28 18:30:09 2011 +0200 summary: add splitedges tools of Mghazli Zoubida changeset: 2257:294a37023d46 user: Frederic Hecht date: Mon Apr 18 11:57:40 2011 +0200 summary: coorect load load under win32 changeset: 2256:4d0308f12e72 user: Frederic Hecht date: Mon Apr 18 09:57:50 2011 +0200 summary: correct load link pk of " and ' in var changeset: 2255:da55768a880d user: Frederic Hecht date: Fri Apr 15 22:31:24 2011 +0200 summary: correct configure.Ac changeset: 2254:83972e23732a user: Frederic Hecht date: Fri Apr 15 21:04:34 2011 +0200 summary: correct configure.ac for mpi under win32 changeset: 2253:2aca6f1b5497 user: Frederic Hecht date: Fri Apr 15 20:35:45 2011 +0200 summary: MPI for win32 changeset: 2252:e145e24f6aa0 parent: 2251:3d2ff16fa1e5 parent: 2250:88c8347babf4 user: Frederic Hecht date: Fri Apr 15 18:28:28 2011 +0200 summary: coorect Makefile changeset: 2251:3d2ff16fa1e5 parent: 2247:246a6ffbd1f1 user: Frederic Hecht date: Fri Apr 15 18:13:05 2011 +0200 summary: coorect mpi configure for win32 changeset: 2250:88c8347babf4 user: Frederic Hecht date: Wed Apr 13 14:14:51 2011 +0200 summary: updaet Heat3d.idp changeset: 2249:3c31e2572e2f user: Frederic Hecht date: Wed Apr 13 14:10:00 2011 +0200 summary: correct typ in Heat3d.idp filename changeset: 2248:6bcbc93c5bca user: Frederic Hecht date: Wed Apr 13 14:07:57 2011 +0200 summary: change Heat3D.idp changeset: 2247:246a6ffbd1f1 user: Frederic Hecht date: Tue Apr 12 22:18:31 2011 +0200 summary: coorect Problem in WHERE quote changeset: 2246:bfcbef551c2e user: Frederic Hecht date: Fri Apr 08 21:47:10 2011 +0200 summary: correct Chaleur changeset: 2245:32829734574c user: Frederic Hecht date: Fri Apr 08 17:37:22 2011 +0200 summary: correct INNOVATION file changeset: 2244:726002c6f090 user: Frederic Hecht date: Fri Apr 08 17:33:38 2011 +0200 summary: remove suprious dump in superlu dist. changeset: 2243:48f3b1e4a098 user: Frederic Hecht date: Thu Apr 07 12:05:18 2011 +0200 summary: correct change for // computing changeset: 2242:a48b9b504aba user: Frederic Hecht date: Wed Apr 06 14:50:49 2011 +0200 summary: correct configure to build file changeset: 2241:18630017f8c9 user: Frederic Hecht date: Wed Apr 06 14:49:07 2011 +0200 summary: Added tag 3.12-1 for changeset cd142ee7324d changeset: 2240:cd142ee7324d tag: 3.12-1 user: Frederic Hecht date: Tue Apr 05 10:21:23 2011 +0200 summary: correct 3d period BC. changeset: 2239:a43c08688b7e user: Frederic Hecht date: Wed Mar 30 13:14:22 2011 +0200 summary: procon gmres remove tgv ???? changeset: 2238:fff6c5feb7b6 user: Frederic Hecht date: Tue Mar 29 21:54:33 2011 +0200 summary: gmres precon same changeset: 2237:e04f738a5db2 user: Frederic Hecht date: Tue Mar 29 21:39:31 2011 +0200 summary: change precon gmres changeset: 2236:c3258922889e user: Frederic Hecht date: Tue Mar 29 21:13:11 2011 +0200 summary: correct precon gmres changeset: 2235:6e138ea49c63 user: Frederic Hecht date: Thu Mar 24 16:56:02 2011 +0100 summary: correct PB compiel for hypre with blas. changeset: 2234:bfe9184061ce user: Frederic Hecht date: Wed Mar 23 17:30:48 2011 +0100 summary: cooret typo changeset: 2233:ed0bb81df53d user: Frederic Hecht date: Wed Mar 23 17:24:34 2011 +0100 summary: add missing MPI_LIB 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 . changeset: 2231:f31959eb8d1f user: Frederic Hecht date: Tue Mar 22 00:59:18 2011 +0100 summary: correcd DDM examples; tyop error changeset: 2230:2c44e0a52112 user: Frederic Hecht date: Mon Mar 21 21:22:49 2011 +0100 summary: coorect missing lin in mkl whith _rf.so .. changeset: 2229:6fc339f2ceff user: Frederic Hecht date: Wed Mar 16 14:55:23 2011 +0100 summary: coorect ref test in tutorial changeset: 2228:7c7128939c45 user: Frederic Hecht date: Wed Mar 16 14:21:49 2011 +0100 summary: corect configure for mpi 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 changeset: 2226:49d4be4bdab9 user: Frederic Hecht date: Tue Mar 15 14:55:54 2011 +0100 summary: coorect pb on configure of mpi (hard jos) 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 changeset: 2224:7e9e01c6e550 user: Frederic Hecht date: Tue Mar 15 14:23:06 2011 +0100 summary: update mshmet to version 3.0 changeset: 2223:417a4450e6f8 user: Frederic Hecht date: Wed Mar 09 22:22:41 2011 +0100 summary: correct mpi correct of sgi changeset: 2222:85735d18b198 user: Frederic Hecht date: Wed Mar 09 21:51:21 2011 +0100 summary: compile with sgi MPI changeset: 2221:7d3bf33d6031 user: Frederic Hecht date: Wed Mar 09 21:35:02 2011 +0100 summary: add check MPI_DOUBLE_COMPLEX in configure changeset: 2220:1d2cb842acb2 user: Frederic Hecht date: Wed Mar 09 11:56:22 2011 +0100 summary: cooret mpi / cpp DOUBLE_COMPLEX changeset: 2219:d0223be2ab7b user: Frederic Hecht date: Wed Mar 09 10:06:50 2011 +0100 summary: correct missing cflags in generic blas compilation changeset: 2218:ed71122c4649 user: Frederic Hecht date: Wed Mar 09 08:54:14 2011 +0100 summary: corrrect loop in makefile when cleanning changeset: 2217:f3f99d1f9f92 user: Frederic Hecht date: Wed Mar 09 08:39:35 2011 +0100 summary: correct loop in clean target makefiles changeset: 2216:8b03d97bb490 user: Frederic Hecht date: Wed Mar 09 08:36:34 2011 +0100 summary: correct clean in freeyam makefile changeset: 2215:5d1babde36d7 user: Frederic Hecht date: Tue Mar 08 17:57:47 2011 +0100 summary: correct mpi compile flags for sgi computer. 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 changeset: 2213:0a53c3f15e2e user: Frederic Hecht date: Wed Feb 09 19:27:59 2011 +0100 summary: add missing file in Makefile dist tag. changeset: 2212:bdae2c1318cc user: Frederic Hecht date: Wed Feb 09 19:23:36 2011 +0100 summary: coorect MPI_DOUBLE_COMPLEX problem in mpi ... changeset: 2211:a16c149daeb4 user: Frederic Hecht date: Wed Feb 09 18:11:31 2011 +0100 summary: correct mpiReduce complex case .. changeset: 2210:94365074e706 user: Frederic Hecht date: Mon Feb 07 20:58:18 2011 +0100 summary: correct some mistake. changeset: 2209:a076fd1237b7 user: Frederic Hecht date: Tue Jan 25 22:11:03 2011 +0100 summary: reomve spuriou dump 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; changeset: 2207:3a8495a5387a user: Frederic Hecht date: Tue Jan 25 11:40:33 2011 +0100 summary: add mpiAllReduce on real , long , complex data type changeset: 2206:08fcb4d98a99 user: Frederic Hecht date: Sun Jan 23 14:34:11 2011 +0100 summary: Added tag 3.12-win32 for changeset bea855340647 changeset: 2205:bea855340647 tag: 3.12-win32 user: Frederic Hecht date: Sun Jan 23 14:33:52 2011 +0100 summary: update INNOVATION changeset: 2204:f6a959c7600c user: Frederic Hecht date: Sat Jan 22 21:44:24 2011 +0100 summary: correct configure for win32 changeset: 2203:e84ba8234183 user: Frederic Hecht date: Thu Jan 20 13:59:58 2011 +0100 summary: correct typo changeset: 2202:09ee2c12edb8 user: Frederic Hecht date: Thu Jan 20 13:57:40 2011 +0100 summary: correct typo changeset: 2201:fb724f3e09a2 user: Frederic Hecht date: Thu Jan 20 13:55:11 2011 +0100 summary: correct install idp file in mpi examples changeset: 2200:dd0ca033a004 user: Frederic Hecht date: Thu Jan 20 13:34:00 2011 +0100 summary: add tag for version 3.12 changeset: 2199:672e0042f083 user: Frederic Hecht date: Thu Jan 20 13:29:52 2011 +0100 summary: Added tag 3.12 for changeset 270198a4a293 changeset: 2198:270198a4a293 tag: 3.12 user: Frederic Hecht date: Thu Jan 20 13:23:35 2011 +0100 summary: correct HISTORY changeset: 2197:e983b6801336 user: Frederic Hecht date: Thu Jan 20 08:32:41 2011 +0100 summary: coorect type in top Makefile changeset: 2196:673a610cc96e user: Frederic Hecht date: Wed Jan 19 23:26:38 2011 +0100 summary: correct mpi sover files changeset: 2195:daea22ad31ee user: Frederic Hecht date: Wed Jan 19 19:43:33 2011 +0100 summary: correct examples++-mpi/Makefile.am changeset: 2194:b5f8a0106cc0 user: Frederic Hecht date: Wed Jan 19 19:30:02 2011 +0100 summary: add missing file changeset: 2193:06476f221b1e user: Frederic Hecht date: Wed Jan 19 18:19:58 2011 +0100 summary: correct medit makefile changeset: 2192:9d6b4e63eb04 user: Frederic Hecht date: Wed Jan 19 17:28:44 2011 +0100 summary: coorect make for install FreeFem++-CoCoa on MAcOS changeset: 2191:60616abdc65f user: Frederic Hecht date: Wed Jan 19 17:15:42 2011 +0100 summary: coorect MPI example ... changeset: 2190:daa42faa6092 user: Frederic Hecht date: Wed Jan 19 16:55:25 2011 +0100 summary: correct MPI example and // solver changeset: 2189:0a5cc096d146 user: Frederic Hecht date: Wed Jan 19 16:42:28 2011 +0100 summary: correct lot of MPI example changeset: 2188:65e69cb8fa59 user: Frederic Hecht date: Wed Jan 19 15:19:20 2011 +0100 summary: add missing files 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 changeset: 2186:38874c1f5f5f user: Frederic Hecht date: Tue Jan 18 23:39:31 2011 +0100 summary: add new MPI example DDM-Schwarz method changeset: 2185:b8dc0377392a user: Frederic Hecht date: Tue Jan 18 18:59:26 2011 +0100 summary: correct mistake in doc changeset: 2184:fb8651ab5956 user: Frederic Hecht date: Tue Jan 18 18:45:59 2011 +0100 summary: see INNOVATION file for all modid changeset: 2183:05d86033bc94 user: Frederic Hecht date: Tue Jan 18 13:13:23 2011 +0100 summary: add README_MAC changeset: 2182:309f9d972d67 user: Frederic Hecht date: Mon Jan 17 23:43:41 2011 +0100 summary: correct isolineP1 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 changeset: 2180:7d53be5311f3 user: Frederic Hecht date: Mon Jan 17 08:11:50 2011 +0100 summary: coorect spurious endl changeset: 2179:3414092a9ef9 user: Frederic Hecht date: Mon Jan 17 08:07:34 2011 +0100 summary: remove spurio endl changeset: 2178:1d166fa13593 user: Frederic Hecht date: Mon Jan 17 08:00:50 2011 +0100 summary: remove spurious cout changeset: 2177:e413924e153f user: Frederic Hecht date: Mon Jan 17 00:04:56 2011 +0100 summary: add macro def; changeset: 2176:e218c243ce05 user: Frederic Hecht date: Thu Jan 13 22:18:17 2011 +0100 summary: correct for MINGW load.link changeset: 2175:272b85192249 user: Frederic Hecht date: Thu Jan 13 21:04:05 2011 +0100 summary: correct FLIBS on win32 case changeset: 2174:e3f2a110bb91 user: Frederic Hecht date: Thu Jan 13 17:19:04 2011 +0100 summary: add gsl interface 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 changeset: 2172:6e8a3de60010 user: Frederic Hecht date: Sat Dec 25 09:23:14 2010 +0100 summary: update te doc changeset: 2171:d4cbf3a97506 user: Frederic Hecht date: Sat Dec 25 08:22:35 2010 +0100 summary: see innovation 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 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 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. changeset: 2167:42f714837f49 user: Frederic Hecht date: Sun Dec 12 00:15:38 2010 +0100 summary: mpi win32 suire ... changeset: 2166:ba43bd5ae9c2 user: Frederic Hecht date: Sun Dec 12 00:11:57 2010 +0100 summary: mpi win32 suite changeset: 2165:18e9fd7513ef user: Frederic Hecht date: Sun Dec 12 00:05:38 2010 +0100 summary: mpi coorect on win32 changeset: 2164:4a2a7e6595ab user: Frederic Hecht date: Sat Dec 11 23:41:02 2010 +0100 summary: correct parallele version for win32 changeset: 2163:3956acc41dd1 user: Frederic Hecht date: Sat Dec 11 21:10:00 2010 +0100 summary: change mpi ef trouth pointer 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 changeset: 2161:34a9d49cc35e user: Frederic Hecht date: Sat Dec 11 14:11:57 2010 +0100 summary: next step changeset: 2160:745e4814c1e2 user: Frederic Hecht date: Sat Dec 11 13:49:26 2010 +0100 summary: correct pb parallele-empty.cpp changeset: 2159:a9e710fd658e user: Frederic Hecht date: Fri Dec 10 23:51:33 2010 +0100 summary: add src/mpi/parallelempi-empty.cpp changeset: 2158:ff130a08ed27 user: Frederic Hecht date: Fri Dec 10 10:14:09 2010 +0100 summary: change default parameter in examples++-mpi/MPIGMRES3D.edp changeset: 2157:00ba78e75b34 user: Frederic Hecht date: Thu Dec 09 19:41:01 2010 +0100 summary: last modif for v 3.11 (may be) changeset: 2156:522db0c6b622 user: Frederic Hecht date: Thu Dec 09 18:16:14 2010 +0100 summary: updeta doc an exp changeset: 2155:4932c2907ee9 user: Frederic Hecht date: Thu Dec 09 17:04:13 2010 +0100 summary: add macro quting 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++) 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, ... changeset: 2152:143e4c285e2e user: Frederic Hecht date: Thu Dec 09 10:34:14 2010 +0100 summary: correct doc and mmg3-d interface changeset: 2151:ffed0beed0f2 user: Frederic Hecht date: Wed Dec 08 23:54:37 2010 +0100 summary: correct pb picking ffmedit remove -O flags changeset: 2150:ee5ac6c2b487 user: Frederic Hecht date: Wed Dec 08 18:10:50 2010 +0100 summary: update makefie 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 changeset: 2148:8016ff3a5430 user: Frederic Hecht date: Tue Dec 07 18:02:17 2010 +0100 summary: update mmg3d interface changeset: 2147:54b806e85c3e user: Frederic Hecht date: Tue Dec 07 16:32:06 2010 +0100 summary: coorect mshmet .. 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 changeset: 2145:444b58f89a98 user: Frederic Hecht date: Tue Dec 07 13:36:42 2010 +0100 summary: coorect freeyams aniso 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) changeset: 2143:baa57509c9cd user: Frederic Hecht date: Thu Dec 02 23:17:52 2010 +0100 summary: see INNOVATION correct MPIGMREs[23]d.edp example changeset: 2142:c01832c2d91e parent: 2141:1ca02db51865 parent: 2140:bae26bfb0b8c user: Frederic Hecht date: Wed Dec 01 16:24:20 2010 +0100 summary: merge ??? changeset: 2141:1ca02db51865 parent: 2139:d87b27635075 user: Frederic Hecht date: Wed Dec 01 15:06:40 2010 +0100 summary: remove file changeset: 2140:bae26bfb0b8c user: Frederic Hecht date: Wed Dec 01 10:44:59 2010 +0100 summary: correct typo changeset: 2139:d87b27635075 user: Frederic Hecht date: Wed Dec 01 10:38:32 2010 +0100 summary: correct the documenation changeset: 2138:9b4cf63d9799 user: Frederic Hecht date: Tue Nov 30 22:07:42 2010 +0100 summary: add file for mlk lib . changeset: 2137:6ebd89576da6 user: Frederic Hecht date: Tue Nov 30 21:05:05 2010 +0100 summary: correct WHERE_LIBRARY-downlaod creation changeset: 2136:9f7e115581d0 user: Frederic Hecht date: Tue Nov 30 19:17:18 2010 +0100 summary: correct mistake in construction of WHERE.gmm file changeset: 2135:d0ec37b43744 user: Frederic Hecht date: Tue Nov 30 17:50:39 2010 +0100 summary: go version 3.10-3 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 changeset: 2133:0ce681a3f66e user: Frederic Hecht date: Thu Nov 25 22:06:41 2010 +0100 summary: add missing file changeset: 2132:c0a45d4c82a9 user: Frederic Hecht date: Thu Nov 25 21:50:27 2010 +0100 summary: correct spurious print with verbosity !=0 changeset: 2131:d0756d2ae8ed user: Frederic Hecht date: Thu Nov 25 21:37:14 2010 +0100 summary: remove spurio print changeset: 2130:9c81e54436fb user: Frederic Hecht date: Thu Nov 25 14:16:34 2010 +0100 summary: correct Laplace-Adapt-3d.edp changeset: 2129:d0f9a7e3ce91 user: Frederic Hecht date: Wed Nov 24 21:20:18 2010 +0100 summary: correct Laplace-Adapt-3d.edp changeset: 2128:9628d985d017 user: Frederic Hecht date: Wed Nov 24 08:55:48 2010 +0100 summary: coorect pb compiel on gnome 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 changeset: 2126:e05ac461f21d user: Frederic Hecht date: Tue Nov 23 13:54:07 2010 +0100 summary: update INNOVATION 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 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 changeset: 2123:ecb2452ebe90 user: Frederic Hecht date: Fri Nov 19 11:37:52 2010 +0100 summary: add getARGV tools changeset: 2122:9297b462cd46 user: Frederic Hecht date: Thu Nov 18 16:31:52 2010 +0100 summary: next step for ff-mpirun install (dur dur) 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 changeset: 2120:27361d73a03b user: Frederic Hecht date: Wed Nov 17 22:04:05 2010 +0100 summary: continung tyoo error ff-mpirun changeset: 2119:a4a681882e69 user: Frederic Hecht date: Wed Nov 17 21:54:25 2010 +0100 summary: correct typo of ff-mpirun in configure.ac changeset: 2118:967660b728d5 user: Frederic Hecht date: Wed Nov 17 21:46:20 2010 +0100 summary: coorect the previous add ff-run changeset: 2117:43b0bed1bd5b user: Frederic Hecht date: Wed Nov 17 21:13:52 2010 +0100 summary: coorect INNOVATION changeset: 2116:993567388442 user: Frederic Hecht date: Wed Nov 17 21:11:58 2010 +0100 summary: add ff-mpirun to launch freefem++-mpi simply changeset: 2115:94e4e901b405 user: Frederic Hecht date: Wed Nov 17 08:03:01 2010 +0100 summary: correct mistake 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 changeset: 2113:79e95c94d4a5 user: Frederic Hecht date: Tue Nov 16 20:09:36 2010 +0100 summary: correct mistyping in metis.cpp changeset: 2112:09b6d06266af user: Frederic Hecht date: Tue Nov 16 19:53:30 2010 +0100 summary: romve cout in metis.cpp changeset: 2111:ac951e2d8008 user: Frederic Hecht date: Tue Nov 16 19:51:00 2010 +0100 summary: remove strange dump changeset: 2110:0addf52a6596 user: Frederic Hecht date: Tue Nov 16 07:34:31 2010 +0100 summary: correct MPI version from gmone machine 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 changeset: 2108:6e7efdc6c4cd user: Frederic Hecht date: Mon Nov 15 10:22:02 2010 +0100 summary: crrect atof, blas WHERE_LIBRARY changeset: 2107:16dedee619b5 user: Frederic Hecht date: Fri Nov 05 09:52:22 2010 +0100 summary: add nex example changeset: 2106:5e33715c5809 user: Frederic Hecht date: Thu Nov 04 19:23:41 2010 +0100 summary: correct output stream changeset: 2105:ad9c5a3700f3 user: Frederic Hecht date: Thu Nov 04 18:25:58 2010 +0100 summary: reove test in MPIGRES2D changeset: 2104:27f8c8458b71 user: Frederic Hecht date: Thu Nov 04 18:19:33 2010 +0100 summary: add missing file changeset: 2103:3b3bdf3ac0c5 user: Frederic Hecht date: Thu Nov 04 18:10:55 2010 +0100 summary: clean changeset: 2102:b2b101c4208d parent: 2099:f9822a5aea7a user: Frederic Hecht date: Thu Nov 04 18:01:07 2010 +0100 summary: remove pb file changeset: 2101:31c99c85707b user: Frederic Hecht date: Thu Nov 04 17:48:49 2010 +0100 summary: add missing idp files changeset: 2100:79615779ae45 user: Frederic Hecht date: Thu Nov 04 17:48:14 2010 +0100 summary: add new MPI example changeset: 2099:f9822a5aea7a user: Frederic Hecht date: Thu Nov 04 16:50:40 2010 +0100 summary: add BinaryIO dynamic lib in example++-load 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 changeset: 2097:74a69bae2f83 user: Frederic Hecht date: Mon Oct 25 14:10:59 2010 +0200 summary: correct MPIGMRES examples changeset: 2096:65da29614162 user: Frederic Hecht date: Fri Oct 22 21:26:27 2010 +0200 summary: correct if (1) ; // trap 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 changeset: 2094:d732b07cba51 user: Frederic Hecht date: Fri Oct 22 15:16:58 2010 +0200 summary: reomve peace of cade for AutoDiff not use changeset: 2093:06b5aeacde3c user: Frederic Hecht date: Fri Oct 22 14:08:30 2010 +0200 summary: Add MPI CG/GMRES function for // computing changeset: 2092:ff22b8c7a500 user: Frederic Hecht date: Fri Oct 08 15:39:32 2010 +0200 summary: update INNOVATION 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,:) changeset: 2090:0ab0cc381341 user: Frederic Hecht date: Wed Oct 06 17:02:11 2010 +0200 summary: correct make check in 3d examples dir changeset: 2089:3d4959d4b6e1 user: Frederic Hecht date: Tue Oct 05 18:34:02 2010 +0200 summary: add missing file changeset: 2088:3748aed79d1c user: Frederic Hecht date: Tue Oct 05 16:34:40 2010 +0200 summary: Added tag release_3_10 for changeset f96e7099dbed changeset: 2087:f96e7099dbed tag: release_3_10 user: Frederic Hecht date: Tue Oct 05 16:32:09 2010 +0200 summary: coorect INNOVATION changeset: 2086:a0a40e1e3132 user: Frederic Hecht date: Tue Oct 05 16:02:04 2010 +0200 summary: add missing install files changeset: 2085:caf345bbc560 user: Frederic Hecht date: Tue Oct 05 15:22:43 2010 +0200 summary: correct install mpi dymanics libs changeset: 2084:03ddaceddb3e user: Frederic Hecht date: Tue Oct 05 14:50:46 2010 +0200 summary: add install of dynamic lin in mpi 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 changeset: 2082:c0c0d05d486c user: Frederic Hecht date: Tue Oct 05 11:30:08 2010 +0200 summary: coorect missing compile parameter in pARMS libs 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. changeset: 2080:672655247fbf user: Frederic Hecht date: Tue Oct 05 00:42:30 2010 +0200 summary: do modif of g++-4.6 changeset: 2079:5b727e03ff94 user: Frederic Hecht date: Fri Oct 01 16:36:38 2010 +0200 summary: mistake in parm makefile changeset: 2078:e0137efef48d user: Frederic Hecht date: Fri Oct 01 16:10:58 2010 +0200 summary: version ok for ubuntu 64 changeset: 2077:f43ece160238 user: Frederic Hecht date: Fri Oct 01 15:47:06 2010 +0200 summary: correctr for version 2.10xs changeset: 2076:f0b9786353ec user: Frederic Hecht date: Fri Oct 01 15:13:40 2010 +0200 summary: coorection fort 3.10 version changeset: 2075:bc78bc18d0b1 user: Frederic Hecht date: Fri Oct 01 12:46:55 2010 +0200 summary: try to close version 3.10 changeset: 2074:e2b8cf20c61b user: Frederic Hecht date: Wed Sep 29 16:33:21 2010 +0200 summary: correct IntallWHERE in gmm makefiel changeset: 2073:10b7a602f98f user: Frederic Hecht date: Wed Sep 29 15:38:54 2010 +0200 summary: correct parms Makefile changeset: 2072:9440ff46f0ea user: Frederic Hecht date: Wed Sep 29 14:19:58 2010 +0200 summary: Add missing exemple changeset: 2071:e843df1be44d user: Frederic Hecht date: Tue Sep 21 22:05:42 2010 +0200 summary: correct -fPIC flags un blacs compilation changeset: 2070:39392778a85e user: Frederic Hecht date: Tue Sep 21 21:24:17 2010 +0200 summary: update INNOVATION 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 ) changeset: 2068:596ef1aa8971 user: Frederic Hecht date: Tue Sep 21 15:12:33 2010 +0200 summary: do autorecconf for add HAVE_SYS_TIME_H changeset: 2067:ea3d2e60219d user: Frederic Hecht date: Tue Sep 21 15:10:08 2010 +0200 summary: coorect gmm Makefile for WHERE ... 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) changeset: 2065:a1c8c12f1363 user: Frederic Hecht date: Tue Sep 21 12:19:21 2010 +0200 summary: correct gmm compile and WHERE def. changeset: 2064:1bed39d421c9 user: Frederic Hecht date: Tue Sep 21 07:55:41 2010 +0200 summary: correct PB with echo_edp changeset: 2063:14e807f30896 user: Frederic Hecht date: Mon Sep 20 22:49:04 2010 +0200 summary: coorect Makefile of mmglib download .. changeset: 2062:2005c8d27803 user: Frederic Hecht date: Mon Sep 20 21:34:12 2010 +0200 summary: correct mmg3lib precompile changeset: 2061:77b950c53405 user: Frederic Hecht date: Mon Sep 20 20:36:40 2010 +0200 summary: add new parameter -ne to remove script output 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 changeset: 2059:04ef78a06b11 user: Frederic Hecht date: Tue Aug 31 13:18:25 2010 +0200 summary: update README changeset: 2058:9f3f911348ff user: Frederic Hecht date: Tue Aug 31 13:11:27 2010 +0200 summary: corect innovation changeset: 2057:87b6d7922730 user: Frederic Hecht date: Tue Aug 31 13:10:35 2010 +0200 summary: add missing compila of mshmet dynamc lib changeset: 2056:5b51781d6c92 user: Frederic Hecht date: Tue Aug 31 13:02:05 2010 +0200 summary: upate INNOVATION 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 changeset: 2054:f3cbf7394995 user: Frederic Hecht date: Tue Aug 31 12:42:00 2010 +0200 summary: coorect typo in asssert mmg3d.cpp changeset: 2053:0b6fd3c42d32 user: Frederic Hecht date: Tue Aug 31 12:30:33 2010 +0200 summary: coorech WHERE of mshlib changeset: 2052:b3e9a365ee44 user: Frederic Hecht date: Tue Aug 31 12:22:40 2010 +0200 summary: add build WHERE changeset: 2051:ac3551adc8c2 user: Frederic Hecht date: Tue Aug 31 11:31:55 2010 +0200 summary: coorect mshmet download compile / makefile 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 changeset: 2049:b31ed80c5418 user: Frederic Hecht date: Mon Aug 30 22:52:10 2010 +0200 summary: coorect INNOVATION and auto compile fftw under win32 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. 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 changeset: 2046:d4c390fea2f5 user: Frederic Hecht date: Mon Aug 30 17:27:51 2010 +0200 summary: correct compile of freeyams and mmg3d under win32 changeset: 2045:008b77f57a47 user: Frederic Hecht date: Mon Aug 30 16:39:06 2010 +0200 summary: add missing file 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 changeset: 2043:3e424de88d66 user: Frederic Hecht date: Mon Aug 30 13:56:19 2010 +0200 summary: correc mmg3d interface (j. Morice) ) changeset: 2042:e6a1f7c85239 user: Frederic Hecht date: Mon Aug 30 13:43:47 2010 +0200 summary: coorect mmg3d interface changeset: 2041:76820d79834a user: Frederic Hecht date: Mon Aug 30 10:31:52 2010 +0200 summary: correct DOC and add dep in ilut.cpp changeset: 2040:6e07fc2d42f8 user: Frederic Hecht date: Fri Aug 27 17:53:53 2010 +0200 summary: update INNOVATION remove warning on pastix 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. changeset: 2038:f6214647e5ab user: Frederic Hecht date: Fri Aug 27 16:32:55 2010 +0200 summary: coorect -fPIC option on Fortrn changeset: 2037:e79df603fcab user: Frederic Hecht date: Fri Aug 27 11:17:59 2010 +0200 summary: coorect fftw Makefie 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 ???) changeset: 2035:7b14eaf9f3ed user: Frederic Hecht date: Fri Aug 27 09:32:47 2010 +0200 summary: update INNOVATION 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 changeset: 2033:c91026108711 user: Frederic Hecht date: Thu Aug 26 20:39:46 2010 +0200 summary: add missing file DOC/plots/multiendmesh.eps changeset: 2032:e6b7488922a9 user: Frederic Hecht date: Thu Aug 26 20:37:52 2010 +0200 summary: add missing file changeset: 2031:704b3d3af23d user: Frederic Hecht date: Thu Aug 26 18:55:46 2010 +0200 summary: See INNOVATION file for explaination of this change 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). changeset: 2029:922d59d4af75 user: Frederic Hecht date: Sat Jul 10 22:06:05 2010 +0200 summary: correct mistake in download/pastix/Makefile changeset: 2028:a2bd2ad4e78a user: Frederic Hecht date: Fri Jul 09 21:06:22 2010 +0200 summary: update REDME and INNOVATION 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. 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 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. 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 changeset: 2023:121ef5fadbf5 user: Frederic Hecht date: Wed Jun 30 18:38:41 2010 +0200 summary: update 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 changeset: 2021:22b443fb5915 user: Frederic Hecht date: Wed Jun 30 15:19:30 2010 +0200 summary: correct pastix complex interface changeset: 2020:b469944f3b63 user: Frederic Hecht date: Tue Jun 29 13:59:08 2010 +0200 summary: corret ff-get-dep.in changeset: 2019:7613e18949b0 user: Frederic Hecht date: Mon Jun 28 10:49:33 2010 +0200 summary: remove stupid assert (matrix sym is CG) changeset: 2018:6be89be787cc user: Frederic Hecht date: Sat Jun 26 22:02:09 2010 +0200 summary: correct hips and pastix interface changeset: 2017:e95f7c430680 user: Frederic Hecht date: Sat Jun 26 21:59:25 2010 +0200 summary: coorect stupid bug (due to remove static). changeset: 2016:4b93ae958d23 user: Frederic Hecht date: Sat Jun 26 21:46:05 2010 +0200 summary: Correct pastix 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 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 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 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 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 changeset: 2010:3bcb7b38c34a user: Frederic Hecht date: Thu Jun 17 10:44:16 2010 +0200 summary: correct download makefile changeset: 2009:1ba4e27c2764 user: Frederic Hecht date: Wed Jun 16 21:16:16 2010 +0200 summary: add build .hgrc comment changeset: 2008:7344a2077883 user: Frederic Hecht date: Wed Jun 16 18:53:05 2010 +0200 summary: try changeset: 2007:b47cd9ba79ca user: Antoine Le Hyaric date: Wed Jun 16 10:31:22 2010 +0200 summary: converting from CVS to Mercurial changeset: 2006:3bb8e4bb93b7 parent: 1962:f5cdd2662eb6 user: convert-repo date: Wed Jun 16 07:27:03 2010 +0000 summary: update tags changeset: 2005:815102f120b1 branch: alh-autoconf user: lehyaric date: Fri Jun 04 15:26:59 2004 +0200 summary: Compilation ok sur Hydre. changeset: 2004:6eb70bcaac52 branch: alh-autoconf user: lehyaric date: Fri Jun 04 12:06:26 2004 +0200 summary: Compilation ok sur idared 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 changeset: 2002:edf4f99d7e54 branch: alh-autoconf user: lehyaric date: Wed Jun 02 12:39:56 2004 +0200 summary: Configuration des telechargements en cours changeset: 2001:06b2ccabec8d branch: alh-autoconf user: lehyaric date: Wed Jun 02 12:30:30 2004 +0200 summary: Configuration des telechargements en cours 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 changeset: 1999:3fd33de0d94b branch: alh-autoconf user: lehyaric date: Tue Jun 01 17:11:53 2004 +0200 summary: Premiere installation Windows 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 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, changeset: 1996:931a8adc93ae branch: alh-autoconf user: lehyaric date: Wed May 26 11:21:29 2004 +0200 summary: Clarification de quelques commentaires. 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: 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 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. 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 changeset: 1991:eed90ccfb2f9 branch: alh-autoconf user: lehyaric date: Mon May 24 18:19:41 2004 +0200 summary: Automake ok sur Debian/Testing. 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. 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. 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 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 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. 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. changeset: 1984:aa87846f7d99 branch: alh-autoconf user: lehyaric date: Wed May 19 11:05:24 2004 +0200 summary: Automake configuré sur macserv2 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. 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. 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 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 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, ...) 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 changeset: 1977:c78650dfe24a branch: alh-autoconf user: hecht date: Mon May 17 11:23:06 2004 +0200 summary: *** empty log message *** 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 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. 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. 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). 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. 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. 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. 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. 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. 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. 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. 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 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. 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++. changeset: 1962:f5cdd2662eb6 user: hecht date: Fri Jun 04 16:26:08 2010 +0200 summary: coorect sunstring tools changeset: 1961:85ef460011b5 user: hecht date: Fri Jun 04 13:27:24 2010 +0200 summary: add missing cast operator from SubString to string changeset: 1960:9d02a34af84e user: morice date: Thu Jun 03 11:54:37 2010 +0200 summary: *** empty log message *** changeset: 1959:60960c8ea65f user: morice date: Wed Jun 02 18:28:54 2010 +0200 summary: *** empty log message *** changeset: 1958:7c18ab4a9896 user: hecht date: Tue May 11 15:27:37 2010 +0200 summary: *** empty log message *** changeset: 1957:a54b6ce6a7e3 user: hecht date: Mon May 10 23:35:08 2010 +0200 summary: continue WHERE configure.ac changeset: 1956:1d450f2bff65 user: hecht date: Mon May 10 22:34:17 2010 +0200 summary: add where seach changeset: 1955:7b465c06c9d2 user: hecht date: Mon May 10 13:41:42 2010 +0200 summary: essai find where for downlaod changeset: 1954:395d818be60c user: hecht date: Mon May 10 13:37:11 2010 +0200 summary: correct essai changeset: 1953:140dcce8e72d user: hecht date: Mon May 10 13:35:14 2010 +0200 summary: *** empty log message *** changeset: 1952:427b025b4dc9 user: hecht date: Mon May 10 11:54:05 2010 +0200 summary: essai de generation de WHERE-LIB changeset: 1951:6e7c71e22ab1 user: hecht date: Sat May 08 20:44:14 2010 +0200 summary: change MPI parameter changeset: 1950:b924356b1e5b user: hecht date: Thu May 06 23:20:39 2010 +0200 summary: try to find mpi with better way changeset: 1949:908a3c5af9ad user: hecht date: Thu May 06 16:04:20 2010 +0200 summary: update OP changeset: 1948:745ef197dbca user: hecht date: Thu May 06 16:04:07 2010 +0200 summary: update OP. changeset: 1947:96c42270bc55 user: hecht date: Thu May 06 15:03:39 2010 +0200 summary: correct win32 trick changeset: 1946:f7b235f1755a user: hecht date: Thu May 06 14:34:18 2010 +0200 summary: *** empty log message *** changeset: 1945:9c1e8dcd9100 user: hecht date: Thu May 06 14:33:58 2010 +0200 summary: co changeset: 1944:f081711c3135 user: hecht date: Fri Apr 30 17:45:19 2010 +0200 summary: change to freeyam changeset: 1943:9fadf6558ab1 user: hecht date: Fri Apr 30 08:25:05 2010 +0200 summary: upat configire.ac changeset: 1942:ffa7bb4d488a user: hecht date: Thu Apr 29 23:14:40 2010 +0200 summary: add freeyams interface changeset: 1941:18f1981049b6 user: hecht date: Thu Apr 29 23:13:49 2010 +0200 summary: update configure.ac for add MPIRUN changeset: 1940:a4a4f315dc9c user: hecht date: Wed Apr 28 13:22:09 2010 +0200 summary: a not to bad download directory changeset: 1939:9d8173ab1050 user: hecht date: Tue Apr 27 22:06:49 2010 +0200 summary: mise a jour changeset: 1938:23e898259fef user: hecht date: Tue Apr 27 14:30:52 2010 +0200 summary: correct mistake in download dir changeset: 1937:828fe5ca6699 user: hecht date: Fri Apr 23 18:34:16 2010 +0200 summary: add new file changeset: 1936:55b9e8dbc3ff user: hecht date: Fri Apr 23 18:32:39 2010 +0200 summary: *** empty log message *** changeset: 1935:49eca60e042b user: hecht date: Fri Apr 23 11:24:01 2010 +0200 summary: try to build automaticaly all parallele solver (huge work) changeset: 1934:e5293a9cdc8a user: hecht date: Thu Apr 22 11:28:45 2010 +0200 summary: *** empty log message *** changeset: 1933:fc1f6516d8f0 user: morice date: Thu Apr 15 16:46:45 2010 +0200 summary: *** empty log message *** changeset: 1932:d7e0beb48e5e user: morice date: Thu Apr 15 11:22:43 2010 +0200 summary: *** empty log message *** changeset: 1931:629f1fe03042 user: morice date: Thu Apr 15 10:59:20 2010 +0200 summary: *** empty log message *** changeset: 1930:0c7899097de2 user: morice date: Mon Apr 12 15:45:36 2010 +0200 summary: *** empty log message *** changeset: 1929:a2b19da7465a user: morice date: Mon Apr 12 15:36:54 2010 +0200 summary: *** empty log message *** changeset: 1928:86be041b52dd user: morice date: Mon Apr 12 15:19:21 2010 +0200 summary: *** empty log message *** changeset: 1927:937c2afd093f user: morice date: Thu Apr 08 16:43:25 2010 +0200 summary: *** empty log message *** changeset: 1926:923abf222ca2 user: hecht date: Thu Apr 01 21:46:42 2010 +0200 summary: pass to version 3.8-2 changeset: 1925:aacaad3df8f6 user: morice date: Thu Apr 01 14:41:54 2010 +0200 summary: orientation for element in movemesh3 changeset: 1924:11023f67b884 user: hecht date: Thu Apr 01 10:47:43 2010 +0200 summary: add sphere6.edp changeset: 1923:83a1575669f0 user: hecht date: Wed Mar 31 15:13:12 2010 +0200 summary: correct changeset: 1922:04a73c54e6ee user: hecht date: Wed Mar 31 14:55:09 2010 +0200 summary: *** empty log message *** changeset: 1921:08a259f0ce22 user: morice date: Wed Mar 31 10:54:59 2010 +0200 summary: *** empty log message *** changeset: 1920:e36d5fe8cd03 user: hecht date: Wed Mar 31 10:50:56 2010 +0200 summary: coorect makefile changeset: 1919:55571ba570f9 user: hecht date: Wed Mar 31 10:31:56 2010 +0200 summary: add new makefile changeset: 1918:e781b347a370 user: hecht date: Tue Mar 30 13:45:47 2010 +0200 summary: update parmetis files changeset: 1917:d90c1e2a30f9 user: morice date: Mon Mar 29 11:58:30 2010 +0200 summary: *** empty log message *** changeset: 1916:c4bcfced6f13 user: morice date: Mon Mar 29 11:19:45 2010 +0200 summary: *** empty log message *** changeset: 1915:b80817aa7ee7 user: morice date: Mon Mar 29 11:07:16 2010 +0200 summary: *** empty log message *** changeset: 1914:65fdb04766e3 user: morice date: Fri Mar 26 17:38:56 2010 +0100 summary: *** empty log message *** changeset: 1913:f4000b122243 user: morice date: Fri Mar 26 16:18:32 2010 +0100 summary: *** empty log message *** changeset: 1912:a33e7018c5a9 user: morice date: Fri Mar 26 15:15:29 2010 +0100 summary: *** empty log message *** changeset: 1911:39e22b59029d user: hecht date: Mon Mar 22 17:18:27 2010 +0100 summary: correct configure.ac mpicxx whta unset before changeset: 1910:2c1683ac514a user: morice date: Mon Mar 22 12:24:25 2010 +0100 summary: *** empty log message *** changeset: 1909:8740c5457454 user: morice date: Mon Mar 22 12:19:55 2010 +0100 summary: *** empty log message *** changeset: 1908:a3f4d18feef7 user: morice date: Mon Mar 22 12:13:11 2010 +0100 summary: *** empty log message *** changeset: 1907:98cf6430a6d4 user: morice date: Mon Mar 22 12:09:59 2010 +0100 summary: *** empty log message *** changeset: 1906:379861275764 user: morice date: Fri Mar 19 15:37:02 2010 +0100 summary: *** empty log message *** changeset: 1905:b763fb4d6610 user: morice date: Fri Mar 19 15:27:54 2010 +0100 summary: *** empty log message *** changeset: 1904:c86ddaec83d9 user: morice date: Fri Mar 19 15:05:39 2010 +0100 summary: *** empty log message *** changeset: 1903:cd1703be1487 user: morice date: Fri Mar 19 14:55:59 2010 +0100 summary: *** empty log message *** changeset: 1902:296133abf0d2 user: morice date: Fri Mar 19 14:52:59 2010 +0100 summary: *** empty log message *** changeset: 1901:090d8fd21d56 user: morice date: Fri Mar 19 14:43:48 2010 +0100 summary: *** empty log message *** changeset: 1900:8f61eac2a513 user: morice date: Fri Mar 19 14:41:13 2010 +0100 summary: *** empty log message *** changeset: 1899:6747aaf6981a user: morice date: Fri Mar 19 14:40:11 2010 +0100 summary: *** empty log message *** changeset: 1898:fe5c75d39268 user: morice date: Fri Mar 19 14:38:29 2010 +0100 summary: *** empty log message *** changeset: 1897:67532e425d3c user: morice date: Fri Mar 19 14:33:01 2010 +0100 summary: *** empty log message *** changeset: 1896:53e8bdd5722a user: morice date: Fri Mar 19 14:26:45 2010 +0100 summary: *** empty log message *** changeset: 1895:dad309f83d1a user: morice date: Fri Mar 19 14:22:24 2010 +0100 summary: *** empty log message *** changeset: 1894:42de76dbd6f2 user: morice date: Fri Mar 19 14:18:40 2010 +0100 summary: *** empty log message *** changeset: 1893:6f2006878f1f user: morice date: Fri Mar 19 14:16:44 2010 +0100 summary: *** empty log message *** changeset: 1892:6aadc8bba606 user: morice date: Fri Mar 19 13:41:21 2010 +0100 summary: *** empty log message *** changeset: 1891:4dc3e10452dd user: hecht date: Tue Mar 09 11:08:40 2010 +0100 summary: correct type ilu.cpp -> ilut.cpp in makefile changeset: 1890:6f245ceae4ce user: hecht date: Sun Mar 07 18:53:45 2010 +0100 summary: add missing file changeset: 1889:827ddd73fd36 user: hecht date: Sun Mar 07 18:27:41 2010 +0100 summary: pass to versio 3.8-1 changeset: 1888:216ef2fd580b user: hecht date: Sun Mar 07 18:16:30 2010 +0100 summary: correct bug in return real[int,int] func 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. changeset: 1886:eb7357e5511a user: hecht date: Wed Feb 10 16:30:50 2010 +0100 summary: corct innovation changeset: 1885:2542e1d811e8 user: hecht date: Wed Feb 10 16:21:35 2010 +0100 summary: correct change renum triangle changeset: 1884:2436e52254e4 user: hecht date: Wed Feb 10 13:04:32 2010 +0100 summary: add renumbering of vertex in 2d mesh. changeset: 1883:931d93f9ac39 user: hecht date: Tue Feb 09 15:53:51 2010 +0100 summary: add tellp tellg seekp seekg changeset: 1882:4fc2a406c26d user: hecht date: Tue Feb 09 11:57:23 2010 +0100 summary: add seekg and teelg changeset: 1881:3d1237b0e08f user: hecht date: Tue Feb 09 10:00:13 2010 +0100 summary: change all.edp build rule changeset: 1880:10c734721deb user: hecht date: Mon Feb 08 19:58:31 2010 +0100 summary: correct makefile changeset: 1879:e3df8d40fb1c user: hecht date: Mon Feb 08 19:23:24 2010 +0100 summary: add missing file changeset: 1878:8a8a0b9efed9 user: hecht date: Mon Feb 08 19:15:35 2010 +0100 summary: correct ' operator in lot of case changeset: 1877:29d816db94eb user: hecht date: Thu Feb 04 20:30:07 2010 +0100 summary: update INNOVATION changeset: 1876:4ecd608b125d user: hecht date: Thu Feb 04 20:10:15 2010 +0100 summary: unify lapack and fflapack load interface. changeset: 1875:91c414a420a3 user: morice date: Thu Feb 04 15:20:38 2010 +0100 summary: *** empty log message *** changeset: 1874:7af250db5757 user: hecht date: Thu Feb 04 14:48:24 2010 +0100 summary: correct lapack seack lib. changeset: 1873:bf8ac5ac2f55 user: hecht date: Thu Feb 04 11:15:07 2010 +0100 summary: correct problem of include search path changeset: 1872:fb13ee753e57 user: hecht date: Wed Feb 03 09:22:35 2010 +0100 summary: add 3d schwarz 3d changeset: 1871:a422afbf9671 user: hecht date: Tue Feb 02 20:51:19 2010 +0100 summary: commeit tipo error changeset: 1870:fc69c1fef879 user: hecht date: Tue Feb 02 20:34:51 2010 +0100 summary: add volume changeset: 1869:c71bd076f2ec user: hecht date: Mon Feb 01 13:45:14 2010 +0100 summary: add tools to get fort wrapper name changeset: 1868:f66e3f760562 user: hecht date: Mon Feb 01 10:50:12 2010 +0100 summary: Update co,figure.ac of MPIF77 , ..., sizeof it, long changeset: 1867:0d16ed2eac32 user: hecht date: Sun Jan 31 17:24:57 2010 +0100 summary: add MPI fortran and CC interface changeset: 1866:238d2e7a177d user: hecht date: Thu Jan 28 20:38:21 2010 +0100 summary: correct edp to idp dir of search .idp files changeset: 1865:769324bb4d73 user: hecht date: Thu Jan 28 17:44:36 2010 +0100 summary: change refface= en label= changeset: 1864:e7899c82f054 user: hecht date: Mon Jan 25 09:10:25 2010 +0100 summary: correct plot of array of FE with new version changeset: 1863:f298bac1900c user: hecht date: Mon Jan 25 07:17:34 2010 +0100 summary: a littte improvante in ffglut (visu of 3d mesh) changeset: 1862:2b1dc85030ca user: hecht date: Mon Jan 25 06:47:11 2010 +0100 summary: ad seekp of ostream file ... changeset: 1861:c1e242006cc8 user: hecht date: Mon Jan 25 06:40:08 2010 +0100 summary: correct topy in 3d plot 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 changeset: 1859:fe7b9cd0f709 user: hecht date: Mon Jan 25 05:47:31 2010 +0100 summary: pass to version 3.8 changeset: 1858:a9c19984fadd user: hecht date: Thu Jan 14 16:18:03 2010 +0100 summary: coorect computation of eigen value on complex full matrix 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 changeset: 1856:e6130f5019ba user: hecht date: Wed Jan 13 18:06:46 2010 +0100 summary: *** empty log message *** changeset: 1855:52a7add0311b user: hecht date: Wed Jan 13 18:03:59 2010 +0100 summary: for mingw freeglut version .... changeset: 1854:b7177e4145d5 user: hecht date: Wed Jan 13 17:28:33 2010 +0100 summary: *** empty log message *** changeset: 1853:6d8ecc9202f5 user: hecht date: Wed Jan 13 17:24:39 2010 +0100 summary: *** empty log message *** changeset: 1852:9bed1f5c517e user: hecht date: Wed Jan 13 17:16:01 2010 +0100 summary: *** empty log message *** changeset: 1851:5cc23ea21a59 user: hecht date: Wed Jan 13 16:06:17 2010 +0100 summary: correct typo in configure.ac under win32 changeset: 1850:2ba47239afb6 user: hecht date: Wed Jan 13 15:14:59 2010 +0100 summary: correct to must cou changeset: 1849:421529d5cb67 user: hecht date: Wed Jan 13 11:02:08 2010 +0100 summary: correction in bamg for 2d ring shaped sub domaines changeset: 1848:795d2400a80a user: hecht date: Tue Jan 12 23:38:00 2010 +0100 summary: patch gmsh Christophe Trophime changeset: 1847:03c7f9f5f133 user: hecht date: Tue Jan 12 21:17:48 2010 +0100 summary: try to build configure for mingw ... changeset: 1846:48b1cd3c2e4b user: morice date: Tue Jan 12 16:15:59 2010 +0100 summary: *** empty log message *** changeset: 1845:f7b3d045a617 user: hecht date: Tue Jan 12 13:53:05 2010 +0100 summary: add exemple changeset: 1844:c603be120d2d user: atenekeng date: Mon Jan 11 23:19:32 2010 +0100 summary: *** empty log message *** changeset: 1843:07d39562f84d user: hecht date: Mon Jan 11 21:02:55 2010 +0100 summary: ass Superlu to version 4.0 changeset: 1842:9652d9a1931e user: hecht date: Mon Jan 11 17:52:18 2010 +0100 summary: *** empty log message *** changeset: 1841:735fdff39099 user: hecht date: Sun Jan 10 22:47:14 2010 +0100 summary: correct spuriou cout changeset: 1840:6c1591ad5660 user: morice date: Tue Jan 05 15:46:48 2010 +0100 summary: *** empty log message *** changeset: 1839:3b36b0cdd71f user: morice date: Tue Jan 05 14:10:13 2010 +0100 summary: *** empty log message *** 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++ changeset: 1837:5110dfd736f3 user: hecht date: Sun Dec 27 19:01:36 2009 +0100 summary: *** empty log message *** changeset: 1836:6b80ef98c41c user: hecht date: Sun Dec 27 18:55:46 2009 +0100 summary: *** empty log message *** changeset: 1835:bc55abed1921 user: hecht date: Sun Dec 27 18:51:04 2009 +0100 summary: coorect gfrotran / lib pb 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. changeset: 1833:8ae1bbb6b9e1 user: hecht date: Sun Dec 27 18:24:51 2009 +0100 summary: correct iovtk.cpp (add tekplot case) changeset: 1832:6e3050d3aacf user: hecht date: Sun Dec 27 12:09:54 2009 +0100 summary: add build interpolation interpolation matrix in 3d 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. changeset: 1830:749462a2fc20 user: hecht date: Fri Dec 11 14:23:48 2009 +0100 summary: trunc3d.cpp is now in mesh3.cpp changeset: 1829:925d3a721e3f user: hecht date: Thu Dec 10 21:38:32 2009 +0100 summary: add wait changeset: 1828:a2e92cb3e6e3 user: hecht date: Thu Dec 10 21:34:40 2009 +0100 summary: remove this supite file in cvs changeset: 1827:58d02edf2d0e user: hecht date: Thu Dec 10 21:33:19 2009 +0100 summary: add trunc mesh in 3d. changeset: 1826:dc4d33da9a55 user: morice date: Thu Dec 10 16:35:06 2009 +0100 summary: *** empty log message *** changeset: 1825:6630293ece4e user: morice date: Thu Dec 10 16:25:01 2009 +0100 summary: *** empty log message *** changeset: 1824:e421852ce6a5 user: morice date: Thu Dec 10 11:17:49 2009 +0100 summary: *** empty log message *** changeset: 1823:fff1817b0b36 user: hecht date: Thu Dec 10 10:18:37 2009 +0100 summary: change lg.y -> lg.ypp changeset: 1822:40b7d100c5d8 user: hecht date: Tue Dec 08 11:37:48 2009 +0100 summary: suite changeset: 1821:56eb1768a904 user: hecht date: Tue Dec 08 11:36:21 2009 +0100 summary: add info in INNOVATION changeset: 1820:f7d8b4e0ae1d user: hecht date: Mon Dec 07 22:22:27 2009 +0100 summary: *** empty log message *** changeset: 1819:c1c8a95285bb user: hecht date: Mon Dec 07 18:17:16 2009 +0100 summary: add example changeset: 1818:fed850c6eb0f user: hecht date: Mon Dec 07 16:23:19 2009 +0100 summary: do best plt of 3d meshes changeset: 1817:c057f46814b0 user: hecht date: Mon Dec 07 09:01:34 2009 +0100 summary: coorect cube.idp and change 3d plot of mesh changeset: 1816:72020a794a9e user: hecht date: Sat Dec 05 18:16:25 2009 +0100 summary: remove imtempestive cout. changeset: 1815:47a39d936529 user: hecht date: Fri Dec 04 15:53:33 2009 +0100 summary: *** empty log message *** changeset: 1814:db02f8bf3214 user: hecht date: Fri Dec 04 15:43:18 2009 +0100 summary: correct FFLIGS flags of windows changeset: 1813:137e79954fe7 user: hecht date: Fri Dec 04 15:36:17 2009 +0100 summary: remove copy of header file form download directory changeset: 1812:b4e4adbe84a3 user: hecht date: Fri Dec 04 15:13:50 2009 +0100 summary: add missing file changeset: 1811:180008496671 user: hecht date: Fri Dec 04 15:11:20 2009 +0100 summary: add missing file changeset: 1810:d8f3474d197b user: hecht date: Fri Dec 04 14:59:43 2009 +0100 summary: correct fortran flag in ff-c++ command changeset: 1809:d52e91d99886 user: hecht date: Fri Dec 04 14:37:58 2009 +0100 summary: add new files for newuao optimiserx changeset: 1808:625009875e58 user: hecht date: Fri Dec 04 13:44:30 2009 +0100 summary: change in innovation 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 changeset: 1806:fc93d1454f21 user: hecht date: Fri Nov 27 11:17:05 2009 +0100 summary: add matrix[int] type in grammar changeset: 1805:bb43bba84bdf user: hecht date: Fri Nov 20 09:38:23 2009 +0100 summary: remove warning changeset: 1804:bff4956d8430 user: hecht date: Fri Nov 20 09:35:47 2009 +0100 summary: remove some warning changeset: 1803:08437a27c2a6 user: hecht date: Thu Nov 19 22:14:40 2009 +0100 summary: add example changeset: 1802:24c6e35d1bda user: hecht date: Thu Nov 19 20:41:26 2009 +0100 summary: *** empty log message *** changeset: 1801:b22f5fecc9fa user: hecht date: Thu Nov 19 20:38:51 2009 +0100 summary: add two examples changeset: 1800:ea3546059a3b user: morice date: Thu Nov 19 16:49:22 2009 +0100 summary: *** empty log message *** changeset: 1799:6828802fdc80 user: hecht date: Sat Nov 14 22:51:05 2009 +0100 summary: in ffglut remove seg to small ??? changeset: 1798:416458502277 user: hecht date: Fri Nov 13 22:32:37 2009 +0100 summary: pass to version 3.7 changeset: 1797:5009b00a38ce user: hecht date: Fri Nov 13 12:19:41 2009 +0100 summary: correct spouriou print changeset: 1796:b1f05929d2d8 user: hecht date: Wed Nov 11 22:46:19 2009 +0100 summary: change changeset: 1795:9543c5eca7b7 user: hecht date: Wed Nov 11 22:45:29 2009 +0100 summary: *** empty log message *** changeset: 1794:a736d190fc78 user: hecht date: Tue Nov 10 20:51:54 2009 +0100 summary: correct install stuff changeset: 1793:33efbea32b77 user: hecht date: Tue Nov 10 20:28:07 2009 +0100 summary: build WHERE_LIBRARY-config file for ff-c++ tools changeset: 1792:1564d9e47726 user: hecht date: Tue Nov 10 15:36:29 2009 +0100 summary: add clapack.h interface changeset: 1791:5df6bba70026 user: hecht date: Tue Nov 10 14:33:50 2009 +0100 summary: correct vtk files changeset: 1790:9b3614fade98 user: hecht date: Mon Nov 09 16:24:48 2009 +0100 summary: passe to version 3.6-1 changeset: 1789:d4ba4d32c211 user: hecht date: Mon Nov 09 15:22:29 2009 +0100 summary: add PICHON stuff (for brute force seaching tet ) 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 changeset: 1787:c8afce8d6282 user: hecht date: Mon Nov 09 11:56:46 2009 +0100 summary: correct mistake this g+= 4.4 compiler changeset: 1786:c7940961398f user: morice date: Fri Nov 06 11:46:05 2009 +0100 summary: *** empty log message *** changeset: 1785:5b9105ef4314 user: morice date: Fri Nov 06 11:44:44 2009 +0100 summary: *** empty log message *** changeset: 1784:e8f258f9446a user: morice date: Fri Nov 06 11:41:40 2009 +0100 summary: *** empty log message *** changeset: 1783:3f117c9abc8d user: morice date: Fri Nov 06 10:50:32 2009 +0100 summary: add new tetgen and medit edp file CVS: ---------------------------------------------------------------------- changeset: 1782:c6eda2a03844 user: hecht date: Thu Nov 05 11:49:07 2009 +0100 summary: add missing file. changeset: 1781:0a6031f38b29 user: hecht date: Wed Nov 04 12:56:48 2009 +0100 summary: change innovation changeset: 1780:8b10917a60ef user: hecht date: Tue Nov 03 21:38:30 2009 +0100 summary: add auto stuff changeset: 1779:8938281ebc2e user: hecht date: Tue Nov 03 21:29:32 2009 +0100 summary: *** empty log message *** changeset: 1778:2d9b15732841 user: hecht date: Tue Nov 03 20:54:39 2009 +0100 summary: passe to version 1.4.3 of tetgen. changeset: 1777:d7ff001547be user: hecht date: Tue Oct 27 17:22:13 2009 +0100 summary: add eigen value full changeset: 1776:c8de02c7971f user: hecht date: Sun Oct 25 18:18:58 2009 +0100 summary: *** empty log message *** changeset: 1775:abb3258333e5 user: hecht date: Sun Oct 25 18:03:03 2009 +0100 summary: *** empty log message *** changeset: 1774:ad90f689e762 user: hecht date: Wed Oct 21 22:19:30 2009 +0200 summary: update INNOVATION file changeset: 1773:0fca1c94a0b5 user: hecht date: Wed Oct 21 22:16:24 2009 +0200 summary: passe to version 3.6 changeset: 1772:961bccd81738 user: hecht date: Wed Oct 21 22:00:51 2009 +0200 summary: coorect .cpp and simlify 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 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 changeset: 1769:d449b7c05ec5 user: hecht date: Mon Oct 19 22:46:57 2009 +0200 summary: add tools to read pcm opticflow changeset: 1768:41a11cfe6bd1 user: hecht date: Thu Oct 15 23:23:01 2009 +0200 summary: coorect assert error in gmres without preconditionner. 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) changeset: 1766:3e99aae2de38 user: morice date: Wed Oct 14 15:25:40 2009 +0200 summary: *** empty log message *** changeset: 1765:5adb0c1b49f2 user: morice date: Tue Oct 13 16:48:58 2009 +0200 summary: *** empty log message *** 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 changeset: 1763:0d06bacf7d81 user: morice date: Fri Oct 09 22:15:38 2009 +0200 summary: *** empty log message *** changeset: 1762:2a7535cf3b0c user: hecht date: Wed Oct 07 13:06:47 2009 +0200 summary: correct print error 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 changeset: 1760:a1266eb439fe user: hecht date: Tue Oct 06 23:01:26 2009 +0200 summary: correct msitake in complex eigenvalue problem. changeset: 1759:8af62e433f06 user: hecht date: Mon Sep 28 22:53:48 2009 +0200 summary: coorect install problem undex windows and Macos. changeset: 1758:2d14d6567664 user: hecht date: Mon Sep 28 21:24:24 2009 +0200 summary: add __VC__ under windows (cygwin) changeset: 1757:b34002c2d4ff user: hecht date: Mon Sep 28 18:43:06 2009 +0200 summary: correct miss tapping in fflaunch++exe changeset: 1756:4c4dc2c8f823 user: hecht date: Mon Sep 28 18:02:18 2009 +0200 summary: coorect miss take in launchff++.cpp filename changeset: 1755:79cc99cce5ab user: hecht date: Mon Sep 28 18:01:21 2009 +0200 summary: corect misstake in filename changeset: 1754:ff040fb58b23 user: morice date: Mon Sep 28 15:46:22 2009 +0200 summary: *** empty log message *** 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) changeset: 1752:f93cbf193dc5 user: hecht date: Thu Sep 24 16:32:45 2009 +0200 summary: coorect plot of 3d meshes changeset: 1751:9b61149decbb user: hecht date: Thu Sep 24 14:38:15 2009 +0200 summary: corect a stop test 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. changeset: 1749:13568ef94d25 user: hecht date: Wed Sep 23 23:28:35 2009 +0200 summary: continuning array of vect FE func 3d changeset: 1748:9ca65f60265e user: hecht date: Wed Sep 23 21:53:47 2009 +0200 summary: correct makefile build WHERE-LIB -download changeset: 1747:9ad5a70d9da5 user: hecht date: Wed Sep 23 21:44:43 2009 +0200 summary: add two examples changeset: 1746:636e0dacf420 user: hecht date: Wed Sep 23 21:28:34 2009 +0200 summary: correct set array of vectorail finite element functions changeset: 1745:fd499d9e6f28 user: hecht date: Tue Sep 22 22:59:17 2009 +0200 summary: rebuild makefile changeset: 1744:c0f785566dae user: hecht date: Tue Sep 22 18:22:10 2009 +0200 summary: add patch filexs changeset: 1743:25480c53626d user: hecht date: Tue Sep 22 11:09:39 2009 +0200 summary: corct make fo intall changeset: 1742:5af770aaac29 user: hecht date: Tue Sep 22 11:01:06 2009 +0200 summary: correct makefile for metis changeset: 1741:e06fc8bfa3e5 user: hecht date: Tue Sep 22 10:54:59 2009 +0200 summary: remove file from data base changeset: 1740:4142e57dd0e6 user: hecht date: Tue Sep 22 10:54:00 2009 +0200 summary: coorect install makes changeset: 1739:76b29386160e user: hecht date: Tue Sep 22 10:43:36 2009 +0200 summary: continius ff-c++ auto changeset: 1738:0695dbc17cb0 user: hecht date: Tue Sep 22 10:25:01 2009 +0200 summary: add missing file changeset: 1737:a6f7a118aff7 user: hecht date: Tue Sep 22 10:18:56 2009 +0200 summary: rebuild makefiles changeset: 1736:879121c3ec58 user: hecht date: Tue Sep 22 10:18:19 2009 +0200 summary: change ff-c++ off auto dep. find changeset: 1735:7a7c7c8057db user: hecht date: Mon Sep 21 22:44:01 2009 +0200 summary: addfile for ff-pkg-download.in changeset: 1734:15ae6f084ad1 user: hecht date: Mon Sep 21 22:43:01 2009 +0200 summary: change movemesh3d to movemesh3 changeset: 1733:5e49222d0c4d user: hecht date: Mon Sep 21 22:38:53 2009 +0200 summary: *** empty log message *** changeset: 1732:878dac9dd908 user: morice date: Wed Sep 16 11:54:52 2009 +0200 summary: *** empty log message *** changeset: 1731:4f2fa344dc0b user: hecht date: Wed Sep 09 18:17:15 2009 +0200 summary: add missing resize of sparse complex matrix changeset: 1730:9d61b8cae5c5 user: hecht date: Mon Sep 07 09:50:52 2009 +0200 summary: add metis changeset: 1729:90e9c94f2793 user: morice date: Fri Sep 04 11:41:30 2009 +0200 summary: *** empty log message *** changeset: 1728:c5dbee61cf58 user: morice date: Fri Sep 04 11:40:09 2009 +0200 summary: *** empty log message *** changeset: 1727:607657f6d2b8 user: hecht date: Thu Sep 03 09:51:01 2009 +0200 summary: add tools of automatics find libs and include changeset: 1726:1ba4ebcbf0d5 user: morice date: Thu Sep 03 08:26:47 2009 +0200 summary: *** empty log message *** changeset: 1725:3de000c981b5 user: hecht date: Wed Sep 02 21:45:38 2009 +0200 summary: add metis link changeset: 1724:260e3f9628d2 user: hecht date: Wed Sep 02 09:58:04 2009 +0200 summary: add MPI_com in solver prameter changeset: 1723:5399bf49daa4 user: morice date: Tue Sep 01 12:41:02 2009 +0200 summary: *** empty log message *** changeset: 1722:a04f554f152e user: morice date: Tue Sep 01 12:30:05 2009 +0200 summary: *** empty log message *** changeset: 1721:3edc358fb626 user: morice date: Tue Sep 01 10:28:55 2009 +0200 summary: *** empty log message *** changeset: 1720:f7df348e0c24 user: hecht date: Mon Aug 31 10:59:34 2009 +0200 summary: CORRECT IN CASE OF mpich changeset: 1719:4a7c39d7edfb user: hecht date: Fri Aug 28 18:11:42 2009 +0200 summary: add missing file to coorect trap tst on ubuntu changeset: 1718:2d6aa202da95 user: hecht date: Fri Aug 28 17:52:20 2009 +0200 summary: coorect README 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 changeset: 1716:b33bbe62d06f user: hecht date: Fri Aug 28 15:08:18 2009 +0200 summary: coorect INNOVATION changeset: 1715:780e891f2505 user: hecht date: Thu Aug 27 22:00:32 2009 +0200 summary: coorect mistake in parallelempi.cpp changeset: 1714:ee657855b460 user: hecht date: Thu Aug 27 21:55:33 2009 +0200 summary: commit version 3.5 see innvovation for all change 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. changeset: 1712:f2ac13edc9e2 user: hecht date: Wed Aug 26 23:02:52 2009 +0200 summary: do a not to bad mpi version changeset: 1711:9dcb3988b48a user: hecht date: Tue Aug 25 16:06:27 2009 +0200 summary: add mpiBarrier + const of mpiGroup and mpiComm (boggus ???) changeset: 1710:728541dd2b77 user: hecht date: Tue Aug 25 10:06:23 2009 +0200 summary: add Scatter, Gather, etc in mpi changeset: 1709:a15319a40921 user: hecht date: Mon Aug 24 23:40:24 2009 +0200 summary: correct mpi version see innovation for detail changeset: 1708:3dc151cd6a93 user: hecht date: Sat Aug 08 21:23:53 2009 +0200 summary: bmo is boggus and correct mistapping in convect_dervieux changeset: 1707:54225cd7c163 user: hecht date: Sat Aug 08 21:12:14 2009 +0200 summary: correct convect files 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 changeset: 1705:5feb310149d3 user: hecht date: Sat Aug 08 20:08:41 2009 +0200 summary: change INNOVATION changeset: 1704:8bdb3c81f330 user: hecht date: Sat Aug 08 19:11:18 2009 +0200 summary: build version 3.4-2 changeset: 1703:4b463c647ff0 user: hecht date: Sat Aug 08 18:25:06 2009 +0200 summary: do new mesh inquire also in 3d changeset: 1702:e91332ff3a6a user: hecht date: Sat Aug 08 10:53:20 2009 +0200 summary: correct mesh.edp example for new mesh inquiring changeset: 1701:eeab886b46aa user: hecht date: Fri Aug 07 22:40:17 2009 +0200 summary: add tools to inquire boudnary directly in freefem++ changeset: 1700:24983130c3d7 user: morice date: Sun Aug 02 14:50:37 2009 +0200 summary: *** empty log message *** changeset: 1699:2a03691fde42 user: morice date: Thu Jul 30 12:55:18 2009 +0200 summary: *** empty log message *** changeset: 1698:77cc1c512479 user: morice date: Thu Jul 30 07:42:48 2009 +0200 summary: *** empty log message *** changeset: 1697:6f77234eaec3 user: morice date: Tue Jul 28 14:42:14 2009 +0200 summary: *** empty log message *** changeset: 1696:2682e3a39f4d user: morice date: Tue Jul 28 14:40:47 2009 +0200 summary: :q changeset: 1695:80772719f92e user: hecht date: Thu Jul 23 12:29:10 2009 +0200 summary: add un first example .. changeset: 1694:439fb84bb0eb user: hecht date: Thu Jul 23 12:17:04 2009 +0200 summary: rewrite of mpi version ... changeset: 1693:a7a22582cfb4 user: hecht date: Wed Jul 22 22:41:32 2009 +0200 summary: retore good version changeset: 1692:b15405b6bd05 user: hecht date: Wed Jul 22 11:30:29 2009 +0200 summary: correct INNOTION 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. changeset: 1690:8acf1467c8c9 user: hecht date: Mon Jul 20 22:30:52 2009 +0200 summary: go to version 3.4-1 changeset: 1689:6fcd68db92d1 user: hecht date: Mon Jul 20 18:23:45 2009 +0200 summary: cosmetic in ffglut changeset: 1688:d3b315513ffe user: hecht date: Mon Jul 20 18:12:06 2009 +0200 summary: update ffglut changeset: 1687:5505e8ebf028 user: hecht date: Fri Jul 10 11:02:37 2009 +0200 summary: correct load.link.in or un test changeset: 1686:ae67b591599d user: hecht date: Fri Jul 10 10:53:56 2009 +0200 summary: coorect ff-c++ on win3é changeset: 1685:f384c5351ff5 user: hecht date: Fri Jul 10 10:19:05 2009 +0200 summary: correct ff-c++ of windows case and cygwin 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) changeset: 1683:d2dee6881044 user: hecht date: Thu Jul 09 18:31:39 2009 +0200 summary: *** empty log message *** changeset: 1682:b4e586ac5a72 user: hecht date: Thu Jul 09 17:50:43 2009 +0200 summary: add -wait parameter for window launchff++ wrapper changeset: 1681:38744c349358 user: hecht date: Thu Jul 09 17:49:50 2009 +0200 summary: *** empty log message *** changeset: 1680:c75e3e2fa17e user: morice date: Wed Jul 08 17:58:43 2009 +0200 summary: *** empty log message *** changeset: 1679:807c14a16f98 user: morice date: Wed Jul 08 17:22:08 2009 +0200 summary: *** empty log message *** changeset: 1678:05f5547c5d1d user: morice date: Wed Jul 08 16:55:41 2009 +0200 summary: *** empty log message *** changeset: 1677:1e5e278eedaa user: morice date: Wed Jul 08 14:36:26 2009 +0200 summary: *** empty log message *** changeset: 1676:8d2f6a01f018 user: hecht date: Tue Jul 07 09:07:24 2009 +0200 summary: correct mpi version 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 changeset: 1674:63f2ef1d3223 user: morice date: Thu Jul 02 18:11:49 2009 +0200 summary: *** empty log message *** changeset: 1673:d0503b06c6db user: hecht date: Tue Jun 30 21:06:38 2009 +0200 summary: correct PlotStream io in case of array with check. changeset: 1672:9a2c7fd9711d user: hecht date: Mon Jun 29 18:45:51 2009 +0200 summary: change crimon-freefem++.zip in crimson-freefem++.zip changeset: 1671:68133db4e985 user: hecht date: Mon Jun 29 16:01:42 2009 +0200 summary: p ss to version 3.4 changeset: 1670:eda4376bbd73 user: hecht date: Tue Jun 23 18:13:40 2009 +0200 summary: change ffglut to bee more safe (version) changeset: 1669:2c7d0aa50098 user: hecht date: Thu Jun 18 09:45:06 2009 +0200 summary: correct include hpd -> idp changeset: 1668:1e5e630dddd5 user: hecht date: Tue Jun 16 14:42:59 2009 +0200 summary: coorect bug on window changeset: 1667:9a28c7cf6052 user: morice date: Tue Jun 16 11:57:25 2009 +0200 summary: *** empty log message *** changeset: 1666:d17316a654b9 user: hecht date: Tue Jun 16 11:08:06 2009 +0200 summary: *** empty log message *** 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 changeset: 1664:2e25f004c497 user: hecht date: Tue Jun 16 10:36:46 2009 +0200 summary: *** empty log message *** changeset: 1663:c047ea6fb673 user: hecht date: Tue Jun 16 10:30:42 2009 +0200 summary: before the next version changeset: 1662:2932f81e8687 user: hecht date: Tue Jun 16 10:25:33 2009 +0200 summary: coorect idp file in mortar exemple changeset: 1661:822b5c8b04a1 user: hecht date: Mon Jun 15 22:36:55 2009 +0200 summary: correct bug in makefile changeset: 1660:51a37d2faf4a user: morice date: Mon Jun 15 18:16:49 2009 +0200 summary: *** empty log message *** changeset: 1659:bcb8a1242d1b user: hecht date: Fri Jun 12 23:09:42 2009 +0200 summary: *** empty log message *** changeset: 1658:83e491da131a user: hecht date: Mon Jun 08 13:42:52 2009 +0200 summary: do small correct in 2 member: changeset: 1657:2caaa85b26e3 user: morice date: Mon Jun 08 12:48:34 2009 +0200 summary: *** empty log message *** changeset: 1656:19a76fdcdba5 user: morice date: Mon Jun 08 12:45:41 2009 +0200 summary: *** empty log message *** changeset: 1655:9805b179ac69 user: morice date: Mon Jun 08 12:35:10 2009 +0200 summary: *** empty log message *** changeset: 1654:b33eb490c839 user: morice date: Mon Jun 08 12:03:12 2009 +0200 summary: *** empty log message *** changeset: 1653:45466a37654f user: hecht date: Mon Jun 08 11:16:23 2009 +0200 summary: add Egde03d and RT03d finite element , correct mistake in changeset: 1652:a3e88f63360c user: morice date: Fri Jun 05 14:27:05 2009 +0200 summary: *** empty log message *** changeset: 1651:e0a2e8d5cfd2 user: hecht date: Thu Jun 04 12:56:41 2009 +0200 summary: to avec good makefiel changeset: 1650:7c00e01ad51b user: hecht date: Thu Jun 04 09:58:56 2009 +0200 summary: correct Dxwriter tools changeset: 1649:0ad3748de454 user: hecht date: Thu Jun 04 09:37:14 2009 +0200 summary: add file changeset: 1648:a1494782af5b user: hecht date: Thu Jun 04 08:35:49 2009 +0200 summary: add RT0 in 3D . 5 first test) 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) changeset: 1646:229d1df51b18 user: atenekeng date: Tue Jun 02 23:40:49 2009 +0200 summary: *** empty log message *** changeset: 1645:442c0aac83f2 user: atenekeng date: Tue Jun 02 23:33:38 2009 +0200 summary: *** empty log message *** changeset: 1644:b6bbb2eb44d0 user: atenekeng date: Tue Jun 02 23:27:30 2009 +0200 summary: *** empty log message *** changeset: 1643:0831c6a1027f user: atenekeng date: Tue Jun 02 23:22:36 2009 +0200 summary: *** empty log message *** changeset: 1642:a459d624d2f7 user: atenekeng date: Tue Jun 02 23:12:44 2009 +0200 summary: *** empty log message *** changeset: 1641:fc0bd0023280 user: hecht date: Tue Jun 02 15:40:01 2009 +0200 summary: begin of RT0 in 3D. changeset: 1640:00f642dd30c1 user: hecht date: Mon Jun 01 18:29:48 2009 +0200 summary: add tool to build surfqce mesh. changeset: 1639:43b260ee40b7 user: hecht date: Mon Jun 01 18:28:16 2009 +0200 summary: V 3.3-1 1 juin 2009 changeset: 1638:dbd423d4d000 user: hecht date: Fri May 29 13:35:03 2009 +0200 summary: reove unused files 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. changeset: 1636:9d7dbf3295c1 user: hecht date: Thu May 28 18:33:25 2009 +0200 summary: begin of clean real array in function. changeset: 1635:cf621a076ad3 user: hecht date: Wed May 27 13:56:54 2009 +0200 summary: correct convect 3d.. changeset: 1634:a56bc9158f09 user: hecht date: Tue May 26 18:05:27 2009 +0200 summary: correct -o in find 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 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) changeset: 1631:7e03dc459f0e user: hecht date: Mon May 25 11:42:53 2009 +0200 summary: version 3.3 changeset: 1630:ae1868421420 user: atenekeng date: Mon May 18 02:44:56 2009 +0200 summary: *** empty log message *** changeset: 1629:69b580f397be user: hecht date: Sun May 17 21:02:40 2009 +0200 summary: add -fPIC flags on 64 achitecture changeset: 1628:8ddd25c5ca25 user: hecht date: Fri May 15 21:02:32 2009 +0200 summary: add 3d eigen value tools 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 changeset: 1626:a97da324c99e user: hecht date: Wed May 13 13:20:28 2009 +0200 summary: put coorect for new sparse matrix intercale changeset: 1625:c6cb0b28b7bb user: hecht date: Wed May 13 13:19:09 2009 +0200 summary: remove to change in SuperLU.cpp changeset: 1624:0c1099452f82 user: hecht date: Wed May 13 13:10:20 2009 +0200 summary: put correct changeset: 1623:70718c5b4084 user: hecht date: Wed May 13 10:25:44 2009 +0200 summary: add oone output 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. changeset: 1621:8d5c2e7a6033 user: hecht date: Wed May 13 09:12:05 2009 +0200 summary: add fig in doc. changeset: 1620:8f797289de2b user: hecht date: Mon May 11 09:05:58 2009 +0200 summary: add pgm figure exemple file 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 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 changeset: 1617:9a32089d27c6 user: hecht date: Thu Apr 30 10:07:55 2009 +0200 summary: comment change in dump in RNM.hpp changeset: 1616:af2b47c9eec9 user: hecht date: Thu Apr 30 09:52:57 2009 +0200 summary: add sort of array and in parallel int array changeset: 1615:d9457f8f8a82 user: morice date: Wed Apr 29 18:40:30 2009 +0200 summary: *** empty log message *** changeset: 1614:d93e87702112 user: morice date: Wed Apr 29 18:37:15 2009 +0200 summary: *** empty log message *** changeset: 1613:58344eff0231 user: hecht date: Wed Apr 29 09:12:46 2009 +0200 summary: add missing file to inv full matrix. changeset: 1612:492aae1c8104 user: hecht date: Mon Apr 27 23:30:00 2009 +0200 summary: add missing delete changeset: 1611:22b1da7215e8 user: hecht date: Mon Apr 27 23:05:26 2009 +0200 summary: update iNNOVATIO changeset: 1610:a0cba860253b user: hecht date: Mon Apr 27 23:02:34 2009 +0200 summary: update innovation changeset: 1609:4d114f69dcc6 user: hecht date: Mon Apr 27 21:56:45 2009 +0200 summary: add missing files changeset: 1608:65650e9ec1b0 user: hecht date: Mon Apr 27 21:55:44 2009 +0200 summary: correct example changeset: 1607:88667b360b31 user: hecht date: Mon Apr 27 21:24:59 2009 +0200 summary: add perodic FESpace in 3d changeset: 1606:3ef7b85f0698 user: morice date: Wed Apr 22 18:06:47 2009 +0200 summary: *** empty log message *** changeset: 1605:ee777f6df0eb user: morice date: Wed Apr 22 17:51:29 2009 +0200 summary: *** empty log message *** changeset: 1604:2bd5f0930f42 user: morice date: Wed Apr 22 11:12:30 2009 +0200 summary: *** empty log message *** changeset: 1603:edf35a172e75 user: morice date: Tue Apr 21 16:16:10 2009 +0200 summary: *** empty log message *** changeset: 1602:95da9106cc83 user: morice date: Tue Apr 21 15:33:13 2009 +0200 summary: *** empty log message *** changeset: 1601:998fb4969917 user: morice date: Tue Apr 21 15:29:16 2009 +0200 summary: *** empty log message *** changeset: 1600:87657798c2cb user: morice date: Tue Apr 21 15:09:00 2009 +0200 summary: *** empty log message *** changeset: 1599:44156c3a14df user: morice date: Tue Apr 21 13:51:17 2009 +0200 summary: *** empty log message *** changeset: 1598:8e33508e3599 user: morice date: Tue Apr 21 13:41:11 2009 +0200 summary: *** empty log message *** changeset: 1597:664a71a6bf78 user: morice date: Mon Apr 20 14:07:04 2009 +0200 summary: *** empty log message *** changeset: 1596:b875c74a428e user: morice date: Mon Apr 20 13:17:47 2009 +0200 summary: *** empty log message *** changeset: 1595:04341a068ff7 user: morice date: Mon Apr 20 13:15:51 2009 +0200 summary: *** empty log message *** changeset: 1594:d57fa2584133 user: morice date: Mon Apr 20 13:13:39 2009 +0200 summary: *** empty log message *** changeset: 1593:1bfe35d03d32 user: hecht date: Fri Apr 17 09:29:40 2009 +0200 summary: to be sur changeset: 1592:10c357445573 user: hecht date: Fri Apr 17 00:50:42 2009 +0200 summary: add dump changeset: 1591:915380e22bf9 user: hecht date: Fri Apr 17 00:30:10 2009 +0200 summary: gros modif dans la gestion des parameters pour le changeset: 1590:465673ac5e9d user: hecht date: Wed Apr 15 19:17:15 2009 +0200 summary: correct search of lapack lib 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) changeset: 1588:f2650d954b5e user: hecht date: Wed Apr 15 18:21:38 2009 +0200 summary: do autoreconf changeset: 1587:9ee6ee15818c user: hecht date: Wed Apr 15 18:18:22 2009 +0200 summary: coorect --enable-m64 flags compile changeset: 1586:9c12b436f339 user: hecht date: Wed Apr 15 18:12:04 2009 +0200 summary: correct Makefile-MacOs changeset: 1585:df486d895352 user: hecht date: Wed Apr 15 11:15:40 2009 +0200 summary: passe to version 3.2 changeset: 1584:d0e8b898a63e user: hecht date: Wed Apr 15 11:11:58 2009 +0200 summary: do change for 64 bits on macos. changeset: 1583:b43d23573147 user: hecht date: Tue Mar 31 13:38:09 2009 +0200 summary: add P1b3d changeset: 1582:79f9321ebe42 user: morice date: Fri Mar 20 12:18:43 2009 +0100 summary: *** empty log message *** changeset: 1581:89bbe7fed648 user: morice date: Fri Mar 20 11:25:41 2009 +0100 summary: *** empty log message *** changeset: 1580:03b88bc9b368 user: morice date: Tue Mar 17 11:16:44 2009 +0100 summary: *** empty log message *** changeset: 1579:5b219bb5581f user: morice date: Mon Mar 16 18:16:41 2009 +0100 summary: *** empty log message *** changeset: 1578:3bd564aa3f9f user: hecht date: Sat Mar 14 17:27:32 2009 +0100 summary: version 3.1-0 changeset: 1577:76c7acba2b50 user: hecht date: Sat Mar 14 17:12:15 2009 +0100 summary: coorect load.link.in for f77 compile. changeset: 1576:d1c3f8fd5e7a user: morice date: Thu Mar 12 14:32:53 2009 +0100 summary: *** empty log message *** changeset: 1575:8b3b4532b68d user: morice date: Thu Mar 12 13:43:36 2009 +0100 summary: bug trouver dans Find: changeset: 1574:142b82fe9837 user: morice date: Thu Mar 12 13:39:12 2009 +0100 summary: *** empty log message *** changeset: 1573:68e386efcdfa user: hecht date: Mon Mar 09 15:00:18 2009 +0100 summary: version 3.1 fist step changeset: 1572:41dfdbb8dfa0 user: hecht date: Thu Mar 05 11:17:23 2009 +0100 summary: correct INNOVATION and remove print 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) changeset: 1570:ae36727a4ce3 user: hecht date: Mon Mar 02 14:52:15 2009 +0100 summary: make version 3.0-6 changeset: 1569:758a2e0f2057 user: hecht date: Thu Feb 12 16:19:41 2009 +0100 summary: correct bmo and extra dump changeset: 1568:13d77a1f83c3 user: hecht date: Thu Feb 12 09:04:47 2009 +0100 summary: version 3.0-6 changeset: 1567:3537e6e5bd56 user: hecht date: Thu Feb 12 08:47:20 2009 +0100 summary: add required edges in adaptmesh tools. changeset: 1566:0a7a4da722d6 user: hecht date: Wed Feb 11 16:12:09 2009 +0100 summary: *** empty log message *** 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 ... changeset: 1564:ef831f851c3e user: hecht date: Wed Feb 11 13:36:20 2009 +0100 summary: add option -nowait for windows. changeset: 1563:8e8c47f158db user: hecht date: Mon Feb 09 09:41:57 2009 +0100 summary: add 3d color .... changeset: 1562:9ef4b48c94e5 user: hecht date: Fri Feb 06 11:15:24 2009 +0100 summary: correct missing tapping 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. changeset: 1560:ff43f245e2f3 user: hecht date: Thu Feb 05 16:29:09 2009 +0100 summary: add new file for tet siplit. changeset: 1559:1498e333f6d9 user: morice date: Tue Feb 03 17:45:55 2009 +0100 summary: *** empty log message *** changeset: 1558:b70b991cd78c user: morice date: Tue Feb 03 15:09:59 2009 +0100 summary: *** empty log message *** changeset: 1557:b6672aa52178 user: morice date: Tue Feb 03 15:03:02 2009 +0100 summary: *** empty log message *** changeset: 1556:e3dd766cd68b user: hecht date: Tue Jan 27 16:11:43 2009 +0100 summary: remove last change (bogus) changeset: 1555:4c5377a65671 user: hecht date: Tue Jan 27 16:09:04 2009 +0100 summary: correct dy(uh) when uh is P13d. (always 0) changeset: 1554:ca9caabbe3bc user: morice date: Fri Jan 23 16:14:30 2009 +0100 summary: *** empty log message *** changeset: 1553:018249cdee99 user: morice date: Fri Jan 23 16:13:24 2009 +0100 summary: *** empty log message *** changeset: 1552:3db53e497a18 user: hecht date: Wed Jan 21 11:04:10 2009 +0100 summary: correct bin-win32 install exe changeset: 1551:7a0f31302d16 user: hecht date: Wed Jan 21 10:56:45 2009 +0100 summary: correct install bin-win32 changeset: 1550:91eefe9e3612 user: hecht date: Wed Jan 21 10:13:06 2009 +0100 summary: remove crazy file changeset: 1549:b6835240f938 user: hecht date: Tue Jan 20 20:56:59 2009 +0100 summary: correct the install on under windows / cygwin changeset: 1548:ae5d95f70891 user: hecht date: Sun Jan 18 19:25:03 2009 +0100 summary: *** empty log message *** changeset: 1547:c5083029fcff user: hecht date: Sun Jan 18 17:21:33 2009 +0100 summary: *** empty log message *** changeset: 1546:9dc587c45dff user: hecht date: Fri Jan 16 23:02:59 2009 +0100 summary: correct ffglut.cpp changeset: 1545:a0e928ee7675 user: morice date: Fri Jan 16 11:38:05 2009 +0100 summary: *** empty log message *** changeset: 1544:2ccf8785babb user: morice date: Fri Jan 16 10:54:55 2009 +0100 summary: *** empty log message *** changeset: 1543:6d0a2e03c885 user: morice date: Fri Jan 16 10:53:39 2009 +0100 summary: ajout de savesurfacemesh 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 changeset: 1541:bb42989cee29 user: hecht date: Mon Jan 12 00:12:58 2009 +0100 summary: add dx witer and test salalo80@gmail.com changeset: 1540:350a96823dc1 user: hecht date: Sat Jan 10 22:26:33 2009 +0100 summary: pass to version 3.0-5 changeset: 1539:0bac5193dd77 user: morice date: Thu Jan 08 10:41:21 2009 +0100 summary: *** empty log message *** changeset: 1538:bb5d8553df2c user: hecht date: Wed Jan 07 17:21:59 2009 +0100 summary: add new comment file changeset: 1537:e6bc0b8eb690 user: morice date: Wed Jan 07 12:00:25 2009 +0100 summary: *** empty log message *** changeset: 1536:bbe299dedeb9 user: hecht date: Wed Jan 07 09:55:41 2009 +0100 summary: correct window message in ffglut changeset: 1535:df5a030a7a05 user: hecht date: Wed Jan 07 08:48:03 2009 +0100 summary: correct 3d view setting changeset: 1534:172df02611b6 user: hecht date: Tue Jan 06 23:22:29 2009 +0100 summary: coorect Pvue3 changeset: 1533:76f34874cc73 user: hecht date: Tue Jan 06 23:15:13 2009 +0100 summary: add 3d plot changeset: 1532:0f8e1829074d user: hecht date: Tue Jan 06 20:30:40 2009 +0100 summary: correct changeset: 1531:5f9834701ea2 user: morice date: Tue Jan 06 14:14:35 2009 +0100 summary: *** empty log message *** changeset: 1530:2a6f1aec0d48 user: hecht date: Mon Jan 05 18:20:15 2009 +0100 summary: correct download/tetgen/Makefile more portable 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) changeset: 1528:7356da4183b8 user: hecht date: Mon Jan 05 11:26:43 2009 +0100 summary: add test changeset: 1527:2251f3d08b88 user: hecht date: Mon Jan 05 11:25:30 2009 +0100 summary: correct in2d in 3d (missing factor 0.5) changeset: 1526:2d4a22506f73 user: hecht date: Mon Dec 29 17:34:56 2008 +0100 summary: coorect the seach of the include dir 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. changeset: 1524:a52a4003e09e user: hecht date: Sat Dec 27 18:27:41 2008 +0100 summary: coorect Laplace3d.edp plot with medit changeset: 1523:f0769f2c0b6a user: hecht date: Sat Dec 27 18:27:18 2008 +0100 summary: correct medit.cpp changeset: 1522:5b65b33be28d user: hecht date: Sat Dec 27 17:19:34 2008 +0100 summary: update INNOVATION changeset: 1521:0863f21fe19f user: hecht date: Sat Dec 27 17:15:45 2008 +0100 summary: do pretty print correction changeset: 1520:9730a238b680 user: hecht date: Sat Dec 27 16:48:58 2008 +0100 summary: coorect old bug when return of arry changeset: 1519:35ab771c1a8b user: hecht date: Fri Dec 26 22:50:23 2008 +0100 summary: correct makefile for dist install (change install-sh script) changeset: 1518:ec10c2fe4fe9 user: hecht date: Fri Dec 26 20:31:46 2008 +0100 summary: *** empty log message *** changeset: 1517:6896f3fcf127 user: hecht date: Fri Dec 26 17:38:24 2008 +0100 summary: correct serialeze mesh in 64 mode changeset: 1516:7d5c2a818d42 user: hecht date: Fri Dec 26 17:32:10 2008 +0100 summary: correct serial in 64 bits mode changeset: 1515:5d564e4fe7c2 user: hecht date: Fri Dec 26 17:23:18 2008 +0100 summary: try to correct changeset: 1514:2d379f3e299d user: hecht date: Fri Dec 26 17:07:27 2008 +0100 summary: correct write string changeset: 1513:ae9e13d7244a user: hecht date: Fri Dec 26 17:06:12 2008 +0100 summary: correct write / read string changeset: 1512:86738eb65d94 user: hecht date: Fri Dec 26 16:51:33 2008 +0100 summary: correct Serialize Mesh chang long in long long 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 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 changeset: 1509:28dbac93aec5 user: hecht date: Fri Dec 26 16:01:48 2008 +0100 summary: correct graphics of curve changeset: 1508:cb901fc6fca0 user: hecht date: Thu Dec 18 10:01:05 2008 +0100 summary: correct Makefile and graphoc stuff changeset: 1507:0407685463a7 user: hecht date: Wed Dec 17 23:52:44 2008 +0100 summary: correct ffglut for zooming y -> y-height ???? changeset: 1506:503c8ccb098a user: hecht date: Tue Dec 16 23:04:47 2008 +0100 summary: coorect makefile for install changeset: 1505:10afda2c8acd user: hecht date: Tue Dec 16 20:26:47 2008 +0100 summary: add UMPAck solver changeset: 1504:20c5e5ffc8c4 user: hecht date: Tue Dec 16 20:24:46 2008 +0100 summary: change the umpack matrice solver changeset: 1503:26bc830cccc5 user: hecht date: Tue Dec 16 17:48:59 2008 +0100 summary: correct makefiles changeset: 1502:9a693aa2371a user: morice date: Tue Dec 16 12:07:56 2008 +0100 summary: *** empty log message *** changeset: 1501:93ed40d6a6e6 user: hecht date: Fri Dec 12 15:30:04 2008 +0100 summary: change ../statu.... in.statu (for install on macos) changeset: 1500:aca91a335b08 user: hecht date: Fri Dec 12 15:18:03 2008 +0100 summary: correct configure?ac of ubutu build package 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). changeset: 1498:7299590b0a3c user: hecht date: Fri Dec 12 13:42:50 2008 +0100 summary: correct the arpach driver , (pas mal.. FH) changeset: 1497:84171470d151 user: hecht date: Fri Dec 12 00:30:14 2008 +0100 summary: add the mode in eignevalue like in arpack changeset: 1496:7d7daf75c3ac user: hecht date: Wed Dec 10 10:31:24 2008 +0100 summary: last chnage before version 3.0-2 changeset: 1495:fe9d0abe1c54 user: hecht date: Wed Dec 10 10:21:01 2008 +0100 summary: coorect for win32 changeset: 1494:4d73b3a20b0c user: hecht date: Wed Dec 10 09:47:46 2008 +0100 summary: correct conflict with basename (-> baseName) changeset: 1493:0f58bb952ae8 user: hecht date: Wed Dec 10 08:45:20 2008 +0100 summary: *** empty log message *** changeset: 1492:ca8c350f70e4 user: hecht date: Wed Dec 10 08:37:56 2008 +0100 summary: add ff++.hpp include file to simplify life. changeset: 1491:5101e82dafe6 user: hecht date: Wed Dec 10 00:22:58 2008 +0100 summary: correct miss * in pointer changeset: 1490:a673c97e0d53 user: hecht date: Tue Dec 09 23:56:09 2008 +0100 summary: coorect stuff for loadpath on macos. changeset: 1489:8ec039547530 user: hecht date: Tue Dec 09 18:09:20 2008 +0100 summary: coorect install on macos changeset: 1488:a7374bf14c69 user: hecht date: Tue Dec 09 17:03:50 2008 +0100 summary: change == in = miss tapping changeset: 1487:e45dff48bbd8 user: hecht date: Tue Dec 09 16:59:37 2008 +0100 summary: coorect include dir for install changeset: 1486:3402eeb91b14 user: hecht date: Tue Dec 09 16:43:38 2008 +0100 summary: stablization of install process changeset: 1485:357c63d481f1 user: hecht date: Tue Dec 09 16:24:58 2008 +0100 summary: correct on windows to build file in local dir changeset: 1484:1d6688c93330 user: morice date: Tue Dec 09 16:06:48 2008 +0100 summary: *** empty log message *** changeset: 1483:beb24a04490c user: hecht date: Tue Dec 09 15:05:48 2008 +0100 summary: next changeset: 1482:77eb855e58a3 user: hecht date: Tue Dec 09 15:03:46 2008 +0100 summary: correct binary read on stdin with medit. changeset: 1481:d7db611022fb user: hecht date: Mon Dec 08 22:55:47 2008 +0100 summary: coorect makefile remove dependance with ff-c++ changeset: 1480:be591602d2fe user: hecht date: Mon Dec 08 22:17:14 2008 +0100 summary: corect pb when plot of const function 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 changeset: 1478:5adb19ceadd5 user: hecht date: Mon Dec 08 16:23:50 2008 +0100 summary: correct install dir of freefem++ include, load file. changeset: 1477:7cc876365ccc user: hecht date: Sun Dec 07 23:54:44 2008 +0100 summary: pass tversion 3.0-2 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 changeset: 1475:deeabce583a3 user: hecht date: Sun Dec 07 23:04:26 2008 +0100 summary: cooret of save window console??? changeset: 1474:7a964fb9cc9f user: hecht date: Sun Dec 07 22:51:31 2008 +0100 summary: coorect end freefem, try to save consle text changeset: 1473:94e5bfadd2e9 user: hecht date: Sat Dec 06 23:24:37 2008 +0100 summary: coorect window version add save console at end job changeset: 1472:b072e947c473 user: hecht date: Thu Dec 04 23:31:41 2008 +0100 summary: coorect 3d exampel changeset: 1471:cfe19aab6e91 user: hecht date: Thu Dec 04 23:07:04 2008 +0100 summary: change medit in ffmedit (the freefem++ version of medit) changeset: 1470:e3003c8118ec user: hecht date: Thu Dec 04 22:08:28 2008 +0100 summary: correct .. changeset: 1469:94c6f5128de0 user: hecht date: Thu Dec 04 21:55:00 2008 +0100 summary: add BLASLIB on SuperLu link changeset: 1468:8296e5850e9b user: hecht date: Thu Dec 04 21:28:48 2008 +0100 summary: add no compile on pure win32 changeset: 1467:2ba1cc1df0ce user: hecht date: Thu Dec 04 18:13:09 2008 +0100 summary: coorect Makefile changeset: 1466:beadf0e06de0 user: hecht date: Thu Dec 04 18:07:41 2008 +0100 summary: correct Makefile changeset: 1465:338221666d53 user: hecht date: Thu Dec 04 17:49:24 2008 +0100 summary: coorect makefile changeset: 1464:7b0eb03791c7 user: hecht date: Thu Dec 04 17:35:58 2008 +0100 summary: correct pb unzip changeset: 1463:604e870e1a68 user: hecht date: Thu Dec 04 17:31:14 2008 +0100 summary: coorect Makefile for window changeset: 1462:e78f4ba9d558 user: hecht date: Thu Dec 04 16:19:27 2008 +0100 summary: correct Install-MacOS v3 changeset: 1461:16b7e168e0af user: hecht date: Thu Dec 04 16:14:18 2008 +0100 summary: correct of v3 changeset: 1460:719b338b6647 user: hecht date: Wed Dec 03 23:39:47 2008 +0100 summary: correct makefile for load compilation changeset: 1459:1078ad4956af user: hecht date: Tue Dec 02 11:19:25 2008 +0100 summary: correct build medit (compit.date) changeset: 1458:5ff7097a0422 user: hecht date: Mon Dec 01 22:14:26 2008 +0100 summary: correct ffglut.cpp changeset: 1457:275696a1143d user: hecht date: Sun Nov 30 22:01:37 2008 +0100 summary: change SuperLU.cpp -> SuperLu.cpp changeset: 1456:60ee6e9fa734 user: hecht date: Sun Nov 30 22:00:31 2008 +0100 summary: *** empty log message *** changeset: 1455:4638f02095af user: hecht date: Sun Nov 30 21:43:24 2008 +0100 summary: correct bmo.cpp on cygwin changeset: 1454:5680cb4fc599 user: hecht date: Sun Nov 30 21:26:42 2008 +0100 summary: correct bmo rand generator for win32 changeset: 1453:b813c4de5ff9 user: hecht date: Sat Nov 29 22:38:28 2008 +0100 summary: change rindex -> strrchr under win32 changeset: 1452:62b7a73e0883 user: hecht date: Sat Nov 29 21:49:18 2008 +0100 summary: correct the doc changeset: 1451:3cedfc02647b user: hecht date: Sat Nov 29 21:45:16 2008 +0100 summary: Upgrade the doc changeset: 1450:0f2d69e72651 user: hecht date: Sat Nov 29 19:20:30 2008 +0100 summary: add changeset: 1449:f9d27572c59e user: hecht date: Sat Nov 29 19:14:43 2008 +0100 summary: add configure --disable-dependency-tracking for universal build (macos) changeset: 1448:5972ee9487be user: hecht date: Sat Nov 29 19:02:26 2008 +0100 summary: ok a not to bad version 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) changeset: 1446:3880a683b418 user: hecht date: Sat Nov 29 18:17:37 2008 +0100 summary: correct load example changeset: 1445:c4c1e3ee80a3 user: hecht date: Sat Nov 29 17:39:46 2008 +0100 summary: change bmo.cpp -> lgbmo.cpp changeset: 1444:ae1862b180e5 user: hecht date: Sat Nov 29 17:34:17 2008 +0100 summary: add bmo stuff) changeset: 1443:2607ddbf9df2 user: hecht date: Sat Nov 29 16:47:49 2008 +0100 summary: remove medit lauching when no graphic changeset: 1442:7ff31fce3f84 user: hecht date: Sat Nov 29 16:36:48 2008 +0100 summary: recorrect changeset: 1441:bb346316ad4a user: hecht date: Sat Nov 29 16:32:00 2008 +0100 summary: rebuld regtests.edp changeset: 1440:c10cf4df8949 user: hecht date: Sat Nov 29 16:25:31 2008 +0100 summary: remove glumesh.edp form regtest changeset: 1439:d0f1c7e9c376 user: hecht date: Sat Nov 29 16:05:24 2008 +0100 summary: do graphic only on mpirank==0 changeset: 1438:eee4429533f7 user: hecht date: Sat Nov 29 15:58:42 2008 +0100 summary: correct bug in eigenvalue part. changeset: 1437:0a0f8d8930f9 user: morice date: Fri Nov 28 12:12:32 2008 +0100 summary: *** empty log message *** 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) changeset: 1435:45be17df8622 user: morice date: Fri Nov 28 11:43:19 2008 +0100 summary: *** empty log message *** changeset: 1434:fd52925b5f2a user: hecht date: Fri Nov 28 10:17:32 2008 +0100 summary: miss tappin SuperLU.cpp -> SuperLu.cpp changeset: 1433:acf7ea000d8a user: hecht date: Fri Nov 28 08:09:14 2008 +0100 summary: correct 3d exemples changeset: 1432:b0289a360bb3 user: hecht date: Wed Nov 26 20:17:04 2008 +0100 summary: correct tetgen 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. changeset: 1430:d973280bc7af user: morice date: Wed Nov 26 16:26:31 2008 +0100 summary: *** empty log message *** changeset: 1429:5f00f74d83cd user: hecht date: Tue Nov 25 23:03:41 2008 +0100 summary: a last touch before the version... 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 changeset: 1427:f0e86c3e6d85 user: hecht date: Tue Nov 25 18:38:00 2008 +0100 summary: coorect script for freefem++ app changeset: 1426:9b1df463725b user: hecht date: Tue Nov 25 18:22:54 2008 +0100 summary: coorect install macos changeset: 1425:3c52c2253fb7 user: hecht date: Tue Nov 25 17:27:14 2008 +0100 summary: try to finalise version 3.0-1 changeset: 1424:6d9de1c4a05d user: hecht date: Tue Nov 25 17:09:49 2008 +0100 summary: next changeset: 1423:42713d97f36f user: hecht date: Tue Nov 25 16:49:48 2008 +0100 summary: correct load examples change popoe.cpp in medit.cpp changeset: 1422:779acd0cfbe2 user: hecht date: Tue Nov 25 14:16:39 2008 +0100 summary: add missing file 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 ) changeset: 1420:0d19f82c7039 user: hecht date: Mon Nov 24 23:18:25 2008 +0100 summary: add stuff to save window buff. changeset: 1419:f9ae484334fc user: hecht date: Mon Nov 24 22:46:20 2008 +0100 summary: *** empty log message *** changeset: 1418:9650773d46e0 user: hecht date: Mon Nov 24 21:31:56 2008 +0100 summary: correct layer.edp changeset: 1417:ec0d0e8459b0 user: hecht date: Mon Nov 24 20:49:58 2008 +0100 summary: coorect glumesh2d load (now in freefem++) changeset: 1416:d4c3c0aa5fd8 user: hecht date: Mon Nov 24 20:20:15 2008 +0100 summary: update to 3.0_1 testing changeset: 1415:a29e50390efd user: hecht date: Mon Nov 24 20:10:17 2008 +0100 summary: past to version 3.0-1 changeset: 1414:8ffccb723fd7 user: hecht date: Mon Nov 24 17:22:44 2008 +0100 summary: correct FreeFem++ changeset: 1413:cb84d704cd68 user: hecht date: Mon Nov 24 17:08:38 2008 +0100 summary: correct of missing io changeset: 1412:ca6fdf19f43a user: hecht date: Mon Nov 24 14:47:12 2008 +0100 summary: coorec tmiss tapping changeset: 1411:bf601c202065 user: hecht date: Mon Nov 24 14:45:02 2008 +0100 summary: add window stuff changeset: 1410:069a9f4b35f8 user: hecht date: Mon Nov 24 14:22:26 2008 +0100 summary: correct sing flags with PCrgraph.cpp changeset: 1409:2eff1dc91fa8 user: hecht date: Mon Nov 24 13:58:45 2008 +0100 summary: correct miss tapping changeset: 1408:567bb820c141 user: hecht date: Mon Nov 24 13:44:40 2008 +0100 summary: add @LIBSNOCONSOLE@ to link freefem++ on windows changeset: 1407:a592c340fa42 user: hecht date: Mon Nov 24 10:15:57 2008 +0100 summary: yntaxe err. )) -> ) line 51 changeset: 1406:9456f62f1675 user: hecht date: Mon Nov 24 10:09:54 2008 +0100 summary: do the final (may be ) on no graphics changeset: 1405:d33cd9480a19 user: hecht date: Sun Nov 23 23:24:42 2008 +0100 summary: remove -mwindows flag changeset: 1404:92d820fc3689 user: hecht date: Sun Nov 23 22:56:24 2008 +0100 summary: try to have good version of ffglut changeset: 1403:fd3446efd662 user: hecht date: Sun Nov 23 22:23:51 2008 +0100 summary: correct for win32 api changeset: 1402:cd1e9c3a65f2 user: hecht date: Sun Nov 23 16:40:45 2008 +0100 summary: crrech ff_glut lib under win32 changeset: 1401:eaf758e3a489 user: hecht date: Sun Nov 23 16:32:33 2008 +0100 summary: change glut libs under win32 (no cygwin) changeset: 1400:854085e2d35f user: hecht date: Sun Nov 23 16:21:00 2008 +0100 summary: add new file for win32 comile changeset: 1399:95336c8e2c44 user: hecht date: Sun Nov 23 15:36:58 2008 +0100 summary: update for ffglu and windows changeset: 1398:f9100b0bb790 user: hecht date: Sun Nov 23 14:54:49 2008 +0100 summary: correct of win32 changeset: 1397:7d704bab6a59 user: hecht date: Sun Nov 23 14:53:06 2008 +0100 summary: correct PlotStream.hpp for win32 changeset: 1396:d4bab58e76b7 user: hecht date: Sun Nov 23 10:11:42 2008 +0100 summary: reomve exeption changeset: 1395:7746ed4b6e53 user: hecht date: Sat Nov 22 20:29:26 2008 +0100 summary: *** empty log message *** changeset: 1394:76b21f8a6f07 user: hecht date: Sat Nov 22 18:16:09 2008 +0100 summary: correct Makefile.am changeset: 1393:28088ce8937e user: hecht date: Sat Nov 22 18:15:41 2008 +0100 summary: add threads interface of windows changeset: 1392:302846277f78 user: hecht date: Thu Nov 20 14:05:20 2008 +0100 summary: correct configure.ac fo ffglut compie with pthread changeset: 1391:04a9b160e8c4 user: hecht date: Thu Nov 20 13:28:38 2008 +0100 summary: correct int -> GLint in wiewport array type changeset: 1390:5b0dea51e3ac user: hecht date: Wed Nov 19 14:40:29 2008 +0100 summary: crrect build pkg dir changeset: 1389:0e6bc0a93bdd user: hecht date: Wed Nov 19 14:38:27 2008 +0100 summary: add super bluid lib changeset: 1388:f4ea619db3e9 user: hecht date: Wed Nov 19 11:55:19 2008 +0100 summary: correct of the download/tetgen/Makefile makefile. changeset: 1387:3b6ce28f34f8 user: hecht date: Tue Nov 18 17:38:31 2008 +0100 summary: add missig file 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 changeset: 1385:0f9c81225b28 user: hecht date: Sun Nov 16 12:39:46 2008 +0100 summary: add package you ubuntu 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) changeset: 1383:b7546bc2390c user: hecht date: Sun Nov 16 11:09:58 2008 +0100 summary: remove uninitialiez assert. changeset: 1382:ff78c27246d0 user: hecht date: Sun Nov 16 10:48:56 2008 +0100 summary: coorect libmesh -> libmesh changeset: 1381:552ace2fcfc7 user: hecht date: Sun Nov 16 10:23:09 2008 +0100 summary: coorect Makefile.am dependence to bluid compil.date 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 changeset: 1379:4e8f7f89556a user: hecht date: Sun Nov 16 09:43:24 2008 +0100 summary: correct srv/nw/Makefile.am changeset: 1378:9516426752a3 user: hecht date: Sun Nov 16 09:33:36 2008 +0100 summary: add missing file changeset: 1377:93b754159849 user: hecht date: Sun Nov 16 01:06:32 2008 +0100 summary: Huge change in the graphic part. changeset: 1376:9f86824cee2c user: morice date: Thu Nov 13 16:43:39 2008 +0100 summary: *** empty log message *** changeset: 1375:1589ecf1c4b7 user: morice date: Thu Nov 13 16:40:04 2008 +0100 summary: Removed file changeset: 1374:32d14aaa8bc1 user: morice date: Wed Nov 05 11:15:23 2008 +0100 summary: *** empty log message *** changeset: 1373:0781509f872e user: morice date: Tue Nov 04 17:18:35 2008 +0100 summary: *** empty log message *** changeset: 1372:1faebc041661 user: morice date: Tue Nov 04 17:16:50 2008 +0100 summary: *** empty log message *** changeset: 1371:cf940b88989d user: morice date: Thu Oct 30 11:38:03 2008 +0100 summary: *** empty log message *** changeset: 1370:472ebd5510b3 user: morice date: Thu Oct 30 11:29:15 2008 +0100 summary: *** empty log message *** changeset: 1369:884b6e24b73b user: morice date: Wed Oct 29 16:29:20 2008 +0100 summary: *** empty log message *** changeset: 1368:71743a70f477 user: morice date: Wed Oct 29 15:10:15 2008 +0100 summary: *** empty log message *** changeset: 1367:5f666b631f8b user: morice date: Wed Oct 29 14:12:46 2008 +0100 summary: *** empty log message *** changeset: 1366:5ac0c0b60644 user: morice date: Wed Oct 29 11:24:56 2008 +0100 summary: *** empty log message *** changeset: 1365:d236083ebc43 user: morice date: Wed Oct 29 11:21:03 2008 +0100 summary: *** empty log message *** changeset: 1364:85909104f0c6 user: morice date: Wed Oct 29 11:09:45 2008 +0100 summary: *** empty log message *** changeset: 1363:5cb1c4d257fd user: morice date: Mon Oct 27 10:09:44 2008 +0100 summary: *** empty log message *** changeset: 1362:cf7b0f1fb9da user: hecht date: Mon Oct 20 22:24:33 2008 +0200 summary: add medit to freefem++ changeset: 1361:41bd8613d841 user: hecht date: Mon Oct 20 16:11:57 2008 +0200 summary: add medit in ff++ changeset: 1360:6e76013fe786 user: hecht date: Sun Oct 19 21:59:21 2008 +0200 summary: -- correct none sym eigen arpack call changeset: 1359:97fc195ae7e3 user: hecht date: Fri Oct 17 10:44:44 2008 +0200 summary: coorect memory misstake in profile matrix. changeset: 1358:182ef0dd29d7 user: hecht date: Thu Oct 16 23:10:19 2008 +0200 summary: correct memory problem with valgrind. changeset: 1357:fceafcd3c68a user: hecht date: Mon Oct 13 15:58:25 2008 +0200 summary: correct low of precision of geom changeset: 1356:a98d4ac7e0c7 user: hecht date: Mon Oct 06 16:59:07 2008 +0200 summary: load in correct .edp changeset: 1355:4de09c7ef69d user: hecht date: Mon Oct 06 10:04:30 2008 +0200 summary: correct 3d. convert changeset: 1354:6fb475c41e45 user: hecht date: Mon Oct 06 09:28:36 2008 +0200 summary: correct convect 3D changeset: 1353:a31edb97daea user: hecht date: Mon Oct 06 09:26:17 2008 +0200 summary: correct convect in 3D. changeset: 1352:c17f71265f73 user: morice date: Thu Sep 25 15:00:32 2008 +0200 summary: *** empty log message *** changeset: 1351:e2d0255aa3b7 user: morice date: Thu Sep 25 14:55:41 2008 +0200 summary: *** empty log message *** changeset: 1350:6bad008adbfd user: morice date: Thu Sep 18 11:31:12 2008 +0200 summary: *** empty log message *** changeset: 1349:fcdbf4222941 user: morice date: Thu Sep 18 11:24:59 2008 +0200 summary: *** empty log message *** 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. changeset: 1347:e94555467e80 user: hecht date: Thu Sep 04 13:18:21 2008 +0200 summary: add NSI3d-carac.edp changeset: 1346:fd5ed1df556b user: hecht date: Wed Aug 27 17:07:31 2008 +0200 summary: a fist beta version with 3d convect changeset: 1345:0e28f1046f82 user: hecht date: Wed Aug 27 16:13:16 2008 +0200 summary: correct in case of more than 2 proc. changeset: 1344:bc6b22ce6c7d user: hecht date: Wed Aug 27 15:28:02 2008 +0200 summary: cleanning mpi output changeset: 1343:14964c74521c user: hecht date: Wed Aug 27 15:18:46 2008 +0200 summary: same changeset: 1342:3101fb2fa5a9 user: hecht date: Wed Aug 27 15:16:55 2008 +0200 summary: improve output of end mpi changeset: 1341:c9b452184dc3 user: hecht date: Wed Aug 27 14:50:58 2008 +0200 summary: output clening changeset: 1340:5d9c08ee5b5a user: hecht date: Wed Aug 27 14:30:24 2008 +0200 summary: correct MPI dump changeset: 1339:761f96cc8fa4 user: hecht date: Mon Aug 25 16:18:28 2008 +0200 summary: add new test changeset: 1338:96837b9d8490 user: hecht date: Mon Aug 25 16:01:19 2008 +0200 summary: add meditsol.edp test (bugus) changeset: 1337:631ca7f3b833 user: hecht date: Mon Aug 25 15:23:45 2008 +0200 summary: correct popen.cpp changeset: 1336:3fae4ab680d1 user: hecht date: Mon Aug 25 15:00:35 2008 +0200 summary: add popen.cpp of medit link changeset: 1335:9a3735113e93 user: hecht date: Mon Aug 25 10:57:43 2008 +0200 summary: add convect 3D changeset: 1334:4fd6a0503885 user: hecht date: Wed Jul 23 23:00:00 2008 +0200 summary: a beta version of 3d version changeset: 1333:634631a624d7 user: hecht date: Wed Jul 23 22:11:51 2008 +0200 summary: *** empty log message *** changeset: 1332:dd46501bfe35 user: hecht date: Wed Jul 23 22:09:31 2008 +0200 summary: *** empty log message *** changeset: 1331:5cadbb291dff user: hecht date: Wed Jul 23 14:51:56 2008 +0200 summary: correct CXXFLAGS for load.link changeset: 1330:9acc92fffb15 user: hecht date: Wed Jul 23 14:07:36 2008 +0200 summary: coorect algo.edp changeset: 1329:4f3864fced7f user: hecht date: Wed Jul 23 14:05:48 2008 +0200 summary: *** empty log message *** changeset: 1328:593795622f68 user: hecht date: Wed Jul 23 13:47:08 2008 +0200 summary: add new 3d exemple changeset: 1327:e396a7e86ddf user: hecht date: Wed Jul 23 13:03:58 2008 +0200 summary: *** empty log message *** changeset: 1326:4101a19ce39b user: morice date: Wed Jul 23 12:15:13 2008 +0200 summary: *** empty log message *** changeset: 1325:8511165a8c1a user: morice date: Wed Jul 23 12:10:59 2008 +0200 summary: *** empty log message *** changeset: 1324:a7fbfb69aff9 user: hecht date: Mon Jul 07 22:39:14 2008 +0200 summary: add big change in pointer cleanning of mesh. changeset: 1323:c1c144d0c93e user: morice date: Fri Jun 27 10:45:42 2008 +0200 summary: *** empty log message *** changeset: 1322:72d5d48de380 user: hecht date: Fri Jun 27 10:07:39 2008 +0200 summary: remove const char warning changeset: 1321:0350e3b8531b user: hecht date: Fri Jun 27 10:00:34 2008 +0200 summary: remove tetgen part changeset: 1320:ae68e0e4759d user: hecht date: Fri Jun 27 09:51:03 2008 +0200 summary: correct FQuadTree construction changeset: 1319:dacab2664d74 user: hecht date: Fri Jun 27 09:50:21 2008 +0200 summary: add constructeur dans FQuadTree changeset: 1318:47569a10b553 user: hecht date: Thu Jun 26 17:46:28 2008 +0200 summary: correct RdtoZd fonction changeset: 1317:b286cadc4463 user: morice date: Thu Jun 26 16:12:33 2008 +0200 summary: *** empty log message *** changeset: 1316:bd0a4bc55b82 user: morice date: Thu Jun 26 14:18:52 2008 +0200 summary: *** empty log message *** changeset: 1315:353f0557aeeb user: hecht date: Tue Jun 24 13:36:56 2008 +0200 summary: *** empty log message *** changeset: 1314:b48bf88426b8 user: hecht date: Tue Jun 24 11:48:58 2008 +0200 summary: *** empty log message *** changeset: 1313:db5f17893fd7 user: hecht date: Sun Jun 22 20:45:48 2008 +0200 summary: remove of cout changeset: 1312:d807bb0388ff user: hecht date: Sat Jun 21 14:18:56 2008 +0200 summary: add missing logo changeset: 1311:0f16fe410b58 user: hecht date: Sat Jun 21 14:17:09 2008 +0200 summary: the alpha version. 3.00 changeset: 1310:f6455cf8648e user: hecht date: Sat Jun 21 14:05:00 2008 +0200 summary: add missing files changeset: 1309:07e1db73daf0 user: morice date: Fri Jun 20 16:58:55 2008 +0200 summary: *** empty log message *** changeset: 1308:7b7733d0e797 user: hecht date: Thu Jun 19 23:37:37 2008 +0200 summary: add missing files 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 changeset: 1306:6edc84e14d53 user: hecht date: Thu Jun 19 14:21:08 2008 +0200 summary: un version pas mal changeset: 1305:173c659a2f6f user: hecht date: Wed Jun 18 13:55:36 2008 +0200 summary: add true random function changeset: 1304:3c554295e169 user: hecht date: Wed Jun 18 11:17:57 2008 +0200 summary: coorect error between R2 and R3 stuff. changeset: 1303:8345c9dcffd8 user: hecht date: Fri Jun 13 12:01:42 2008 +0200 summary: coorect missing patch-lapack in arpack changeset: 1302:a8e47b3a6ead user: hecht date: Thu Jun 12 23:30:25 2008 +0200 summary: add missing file changeset: 1301:8419ef4b5ea6 user: hecht date: Tue Jun 10 22:19:20 2008 +0200 summary: remove arpack++ from freefem++ changeset: 1300:5f7e9ae6121c user: hecht date: Tue Jun 10 22:17:25 2008 +0200 summary: remove arpack++ changeset: 1299:47c0d89ac233 user: hecht date: Tue Jun 10 22:15:11 2008 +0200 summary: remove arpack++ changeset: 1298:e2fed9f3b434 user: hecht date: Mon Jun 09 18:36:48 2008 +0200 summary: correction g++ 4.2 changeset: 1297:cde6b903a078 user: hecht date: Mon Jun 09 18:36:08 2008 +0200 summary: correction of g++ 4.2 changeset: 1296:dba2f88087e1 user: morice date: Mon Jun 09 14:32:52 2008 +0200 summary: *** empty log message *** changeset: 1295:a38a0a05c591 user: morice date: Mon Jun 09 14:15:13 2008 +0200 summary: *** empty log message *** changeset: 1294:62223cb51036 user: hecht date: Wed May 28 21:44:49 2008 +0200 summary: a correct in FEproduct changeset: 1293:5725424057d0 user: hecht date: Wed May 28 17:18:14 2008 +0200 summary: remove dump changeset: 1292:8b52cc829a1e user: hecht date: Wed May 28 17:16:34 2008 +0200 summary: the first 3d version running all test changeset: 1291:6677a3cb311b user: hecht date: Mon May 26 17:12:44 2008 +0200 summary: add explicit instenciation E_set_fev3 changeset: 1290:384cb8fc29ec user: hecht date: Mon May 26 16:59:08 2008 +0200 summary: Stokes is working now. changeset: 1289:44bcfe697314 user: hecht date: Mon May 26 09:07:56 2008 +0200 summary: add STokes in 3d 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. changeset: 1287:0601417c00f0 user: hecht date: Thu May 22 16:05:13 2008 +0200 summary: correct pb in mesure of tet. changeset: 1286:13797127fc40 user: hecht date: Wed May 21 12:41:42 2008 +0200 summary: correct GTree Case methode changeset: 1285:25a3f156a803 user: morice date: Wed May 21 11:05:22 2008 +0200 summary: *** empty log message *** changeset: 1284:12639b380533 user: hecht date: Tue May 20 22:05:36 2008 +0200 summary: pb case sensitive in include changeset: 1283:264ad3e9df15 user: hecht date: Tue May 20 16:44:49 2008 +0200 summary: modif for layer meshes. changeset: 1282:eede6e45ca29 user: hecht date: Tue May 20 12:12:16 2008 +0200 summary: correct layer changeset: 1281:9e5802e9e6f2 user: hecht date: Tue May 20 11:08:56 2008 +0200 summary: add 3 files changeset: 1280:25be52991a76 user: hecht date: Fri May 16 10:07:35 2008 +0200 summary: add int2d on border off 3d mesh 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. changeset: 1278:bcf7733f66cf user: hecht date: Thu May 15 23:39:14 2008 +0200 summary: correct class Z3 + Save 3d mesh. changeset: 1277:7f3efc97d905 user: hecht date: Thu May 15 23:11:21 2008 +0200 summary: remove strversionnumber.cpp (build by the makefiel) changeset: 1276:6846c158476b user: hecht date: Thu May 15 23:03:50 2008 +0200 summary: correct win32 mistake double def + PB GQTree R1 changeset: 1275:9b461360cca1 user: hecht date: Thu May 15 14:52:25 2008 +0200 summary: correct missing assert def in src/femlib/QuadratureFormular.cpp changeset: 1274:59f70178b6a3 user: hecht date: Thu May 15 14:13:05 2008 +0200 summary: correct changeset: 1273:4e1c1f21abc0 user: hecht date: Thu May 15 13:31:00 2008 +0200 summary: add missing file changeset: 1272:1e7c8947e560 user: hecht date: Thu May 15 13:28:57 2008 +0200 summary: correct include dir changeset: 1271:20d19853a704 user: hecht date: Thu May 15 12:48:33 2008 +0200 summary: add missing file changeset: 1270:6375ea25c494 user: hecht date: Thu May 15 12:05:19 2008 +0200 summary: a fist 3d version, with PB on boundaru contion. changeset: 1269:93f976abeabc user: hecht date: Thu May 15 00:47:02 2008 +0200 summary: 3d next step changeset: 1268:60d306545870 user: hecht date: Wed May 14 14:48:25 2008 +0200 summary: 3d continuing changeset: 1267:051a2b0b8339 user: hecht date: Wed May 07 16:12:02 2008 +0200 summary: a first 3d version .. changeset: 1266:a11672848900 user: hecht date: Tue Apr 29 22:19:00 2008 +0200 summary: add file changeset: 1265:259dcc851d31 user: hecht date: Tue Apr 29 22:01:24 2008 +0200 summary: correct examples++-load 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) 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 changeset: 1262:e6648830647f user: hecht date: Fri Apr 18 08:26:34 2008 +0200 summary: see innovation + correzction in doc changeset: 1261:59b6014ebe00 user: hecht date: Fri Apr 11 16:52:51 2008 +0200 summary: add formal operator .* and ./ on array [] changeset: 1260:ef82bf406677 user: hecht date: Fri Apr 11 16:14:11 2008 +0200 summary: correct lex.cpp for parameter macro comma between []. changeset: 1259:94fb8bee70ab user: hecht date: Wed Apr 09 15:46:19 2008 +0200 summary: correct eigenvalue, (undo remove 1 line) changeset: 1258:05b9c0c843e5 user: hecht date: Wed Apr 09 14:20:41 2008 +0200 summary: ad resid= vector in eigen value (see arpack doc) changeset: 1257:d32b839daca5 user: hecht date: Wed Apr 09 10:03:09 2008 +0200 summary: correct err 21 trp in mshptg (pile trop petit) changeset: 1256:3cdb4d96732c user: hecht date: Wed Apr 09 09:24:39 2008 +0200 summary: coorect missing trap in case of errror in msgtpg changeset: 1255:40aba1424fd5 user: hecht date: Tue Apr 01 12:05:59 2008 +0200 summary: add Bob Gustafson coorect in the doc. changeset: 1254:99c4f39ceb54 user: hecht date: Thu Mar 27 14:17:50 2008 +0100 summary: correct confire.ac build FLIBS (suite) changeset: 1253:7952d7e59157 user: hecht date: Thu Mar 27 12:17:40 2008 +0100 summary: misa a jour INNOVATION 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 changeset: 1251:7a218e8eb4e4 user: hecht date: Fri Feb 22 18:10:51 2008 +0100 summary: add missing file 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. changeset: 1249:466c6cf70d4e user: hecht date: Tue Feb 19 21:00:35 2008 +0100 summary: correct periodic condition limite to 1 edge. changeset: 1248:292de6acfd0c user: hecht date: Fri Feb 15 11:16:44 2008 +0100 summary: correct include.tar.gz 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 changeset: 1246:5db85e01658c user: hecht date: Thu Feb 14 14:44:20 2008 +0100 summary: rebuild include.tar.gz changeset: 1245:6f7beaf98f55 user: hecht date: Thu Feb 14 14:33:59 2008 +0100 summary: v 2.24 changeset: 1244:71fc0f351404 user: hecht date: Thu Feb 07 15:15:32 2008 +0100 summary: add script to download medit on windows changeset: 1243:37f9085ca0af user: hecht date: Mon Feb 04 15:07:38 2008 +0100 summary: add lazst modification in the doc. changeset: 1242:1d53bd6f9e96 user: hecht date: Fri Feb 01 22:09:10 2008 +0100 summary: add Th=triangule(xx,yy); changeset: 1241:c1f45746fb19 user: hecht date: Tue Jan 29 23:29:12 2008 +0100 summary: add info INNOVATION file 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 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 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 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 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) changeset: 1235:ccbffa0edbc1 user: hecht date: Fri Jan 11 10:59:18 2008 +0100 summary: nothing 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. changeset: 1233:6dc9e9cff6b7 user: hecht date: Sat Jan 05 16:50:32 2008 +0100 summary: correct Makefile to build universal executable file on MacOS 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. 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) changeset: 1230:42ff4f594013 user: hecht date: Thu Dec 20 13:11:42 2007 +0100 summary: correct freefem++-doc changeset: 1229:46601bd22684 user: hecht date: Tue Dec 18 18:35:55 2007 +0100 summary: missing file changeset: 1228:c55ffbf8c297 user: hecht date: Tue Dec 18 18:19:04 2007 +0100 summary: change ref value correct elastycity. 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 changeset: 1226:82ca7c0795f4 user: hecht date: Tue Dec 18 16:43:55 2007 +0100 summary: see innovation correct bug in function with string argument changeset: 1225:30b829eb80a6 user: hecht date: Tue Dec 11 21:18:52 2007 +0100 summary: type correct Pcrgraph changeset: 1224:f93b6dc20752 user: hecht date: Fri Nov 30 13:54:29 2007 +0100 summary: correct error on mpi version changeset: 1223:6b813cebfc7e user: hecht date: Thu Nov 29 12:20:33 2007 +0100 summary: suite changeset: 1222:b31f36430d73 user: hecht date: Thu Nov 29 12:18:20 2007 +0100 summary: *** empty log message *** changeset: 1221:5a4cf32a8ce0 user: hecht date: Thu Nov 29 12:15:25 2007 +0100 summary: next changeset: 1220:013e64381c12 user: hecht date: Thu Nov 29 12:11:42 2007 +0100 summary: correct missing preprocessing variable changeset: 1219:16f1a0466850 user: hecht date: Thu Nov 29 07:42:05 2007 +0100 summary: correct configure.ac for umfpack (sometime missng a library) 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. changeset: 1217:8855b0228166 user: hecht date: Tue Nov 20 16:13:38 2007 +0100 summary: correct bamg on windows missing drawbdmesh.exe 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 changeset: 1215:5140ecde974b user: hecht date: Mon Nov 19 21:40:06 2007 +0100 summary: correct mpi for macos leopard, changeset: 1214:c958ea8751f6 user: hecht date: Mon Nov 19 18:13:44 2007 +0100 summary: correct MPI configure.ac changeset: 1213:5971ef36e8b0 user: hecht date: Mon Nov 19 14:41:30 2007 +0100 summary: continuing changeset: 1212:1d04be51cbd3 user: hecht date: Mon Nov 19 14:40:00 2007 +0100 summary: missing mpiprog changeset: 1211:87b998a26081 user: hecht date: Mon Nov 19 14:25:04 2007 +0100 summary: correct configure.ac missing FreeFem++ with X11 changeset: 1210:8b75110cb5a3 user: hecht date: Mon Nov 19 14:17:36 2007 +0100 summary: correct configure.ac without x11 changeset: 1209:311d084c2046 user: hecht date: Sun Nov 18 13:20:22 2007 +0100 summary: correct documentation for new edition changeset: 1208:24706bfcaeff user: hecht date: Tue Nov 13 16:40:14 2007 +0100 summary: correct doc, changeset: 1207:3d6e666c6d16 user: hecht date: Wed Oct 24 22:17:06 2007 +0200 summary: see INNOVATION file changeset: 1206:7165e6427c0e user: hecht date: Mon Oct 22 18:17:22 2007 +0200 summary: add format + - , trace and det of array changeset: 1205:4389ca545f46 user: hecht date: Tue Oct 02 17:55:05 2007 +0200 summary: correct missing parameter SolveGCPrecon and SolveGCDiag changeset: 1204:7c01e8973cec user: hecht date: Tue Oct 02 16:49:37 2007 +0200 summary: correct miss-spelling 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 changeset: 1202:45e43ae71094 user: hecht date: Sun Sep 30 17:45:11 2007 +0200 summary: Add sparse solver in documentation changeset: 1201:05897868c18c user: hecht date: Thu Sep 20 21:53:50 2007 +0200 summary: add SuperSolevr changeset: 1200:9f9f13a8f113 user: hecht date: Sun Sep 09 21:17:01 2007 +0200 summary: add f2d in case of no fortran changeset: 1199:61b84c52d78d user: hecht date: Fri Sep 07 17:09:59 2007 +0200 summary: add f2c download changeset: 1198:04efc3f5f54b user: hecht date: Fri Sep 07 00:13:17 2007 +0200 summary: recorrect operator += Virtual matrix operator (introduction in august) changeset: 1197:ff3f4337d5e3 user: hecht date: Thu Sep 06 16:23:51 2007 +0200 summary: correct SuperLU and UMFPACK driver + add comparaison changeset: 1196:8ae57860389a user: hecht date: Thu Sep 06 16:02:24 2007 +0200 summary: add missing files changeset: 1195:647ecb3eea6f user: hecht date: Thu Sep 06 15:58:49 2007 +0200 summary: correct 2 def defaulttoGMRES 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 changeset: 1193:b90d965d48fd user: hecht date: Wed Sep 05 23:27:44 2007 +0200 summary: add set sparce solver (morse) changeset: 1192:4ce83180909c user: hecht date: Wed Sep 05 20:15:55 2007 +0200 summary: correct complex part of superLU changeset: 1191:041538d4cb5e user: hecht date: Wed Sep 05 18:03:29 2007 +0200 summary: Add tools to change Sparce Linear Solver 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 changeset: 1189:a5a12103ca64 user: hecht date: Tue Aug 28 17:16:21 2007 +0200 summary: add missing oiperator in array: changeset: 1188:92165ee42a24 user: hecht date: Fri Aug 24 09:12:38 2007 +0200 summary: update doc comtinuing changeset: 1187:da3adb2cfcd8 user: hecht date: Fri Aug 24 08:27:32 2007 +0200 summary: update the doc. changeset: 1186:c5b4f3e3c65d user: hecht date: Mon Aug 20 21:29:52 2007 +0200 summary: add missing file changeset: 1185:866ce6820edc user: hecht date: Mon Aug 20 21:28:18 2007 +0200 summary: correct mean and jump operator in interpolation changeset: 1184:ed49097a6267 user: hecht date: Mon Aug 20 20:07:51 2007 +0200 summary: upgrade INNOVATION changeset: 1183:341e9039538a user: hecht date: Mon Aug 20 18:07:07 2007 +0200 summary: correct, problem of automatic ptr managenemt in plot::operator() changeset: 1182:d10dd6069cd6 user: hecht date: Sun Aug 19 22:05:05 2007 +0200 summary: pass to version 2.19. 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. changeset: 1180:72d9b455a3a7 user: hecht date: Thu Jul 19 19:22:48 2007 +0200 summary: correct AdaptResidualErrorIndicator and download/Makefile.am to changeset: 1179:a0266c67c331 user: hecht date: Thu Jul 19 13:19:01 2007 +0200 summary: add missing compile file in example++-load changeset: 1178:82f8d3d94641 user: hecht date: Thu Jul 19 11:41:48 2007 +0200 summary: see INNOVATION file, past version 2.18 changeset: 1177:df947a9d2fbc user: hecht date: Mon Jul 16 14:47:18 2007 +0200 summary: add quantile changeset: 1176:eb553aa35dea user: hecht date: Fri Jul 13 17:33:23 2007 +0200 summary: add code to sort array changeset: 1175:35694b19dc26 user: hecht date: Fri Jun 29 22:21:50 2007 +0200 summary: xcode projet 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 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 changeset: 1172:542424ec6260 user: hecht date: Wed Jun 20 22:42:21 2007 +0200 summary: correct bilapMorley.edp add missing term in var. formulation. changeset: 1171:3b9e9a1daea3 user: hecht date: Mon Jun 18 22:58:10 2007 +0200 summary: set 2.17-2 changeset: 1170:0ea82558902f user: hecht date: Mon Jun 18 22:42:38 2007 +0200 summary: add mesh example 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) changeset: 1168:33fc210a3294 user: hecht date: Fri Jun 15 13:39:12 2007 +0200 summary: clean the example changeset: 1167:d1c701a50c9b user: hecht date: Fri Jun 15 11:02:46 2007 +0200 summary: correct FreeFem++-Cocoa to add option -v 0 changeset: 1166:730dc114f01f user: hecht date: Fri Jun 15 10:01:07 2007 +0200 summary: add missing files changeset: 1165:ed08ef696a78 user: hecht date: Fri Jun 15 09:33:06 2007 +0200 summary: end of 2.17-1 modif changeset: 1164:2b725188838d user: hecht date: Thu Jun 14 23:03:54 2007 +0200 summary: *** empty log message *** changeset: 1163:26214451b1ab user: hecht date: Thu Jun 14 22:35:37 2007 +0200 summary: next changeset: 1162:fcc2dbd3a9ce user: hecht date: Thu Jun 14 21:49:13 2007 +0200 summary: add -v xx on pc version changeset: 1161:463a69ad8896 user: hecht date: Thu Jun 14 11:54:03 2007 +0200 summary: suite changeset: 1160:5484bd790c1e user: hecht date: Thu Jun 14 10:27:06 2007 +0200 summary: *** empty log message *** changeset: 1159:9e4f6868ccd9 user: hecht date: Thu Jun 14 09:51:10 2007 +0200 summary: clear output when verbosity = 0 changeset: 1158:1584e449a412 user: hecht date: Mon Jun 11 15:37:51 2007 +0200 summary: correct automatique choose of color in plot of arrow changeset: 1157:45091926fd64 user: hecht date: Sat Jun 09 12:15:24 2007 +0200 summary: add boundary= ... flag in plot fonction. changeset: 1156:233789981ccc user: hecht date: Thu Jun 07 12:16:52 2007 +0200 summary: *** empty log message *** changeset: 1155:fc6ca727714b user: hecht date: Thu Jun 07 12:15:23 2007 +0200 summary: *** empty log message *** changeset: 1154:730ea632f37b user: hecht date: Thu Jun 07 11:52:53 2007 +0200 summary: *** empty log message *** changeset: 1153:b2e2ef7ef138 user: hecht date: Thu Jun 07 10:53:13 2007 +0200 summary: correct mistake in tgamma call changeset: 1152:aee96893dd95 user: hecht date: Thu Jun 07 10:37:29 2007 +0200 summary: correct missing update 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 changeset: 1150:c506c2721bc1 user: hecht date: Tue Jun 05 18:02:43 2007 +0200 summary: same for complex eigen value changeset: 1149:0f0ac1c8239d user: hecht date: Tue Jun 05 17:44:32 2007 +0200 summary: add rawvector= in eigenvector 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 changeset: 1147:f83647e00352 user: hecht date: Wed May 16 00:21:37 2007 +0200 summary: just add missing files changeset: 1146:d26722df3ff7 user: hecht date: Wed May 16 00:09:46 2007 +0200 summary: correct Makefile.am for examples++-load/include missing file changeset: 1145:816c2b7c8609 user: hecht date: Tue May 15 23:48:22 2007 +0200 summary: do autoreconf changeset: 1144:ec60d212a134 user: hecht date: Tue May 15 22:01:55 2007 +0200 summary: coorect mistake with libcblas 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 changeset: 1142:be336c51a337 user: hecht date: Thu May 03 10:36:34 2007 +0200 summary: correct Makefile.am dans examples++-load changeset: 1141:c00cb936f998 user: hecht date: Wed May 02 17:29:06 2007 +0200 summary: - Add read sparce matrix form a file changeset: 1140:f4d3b4252673 user: hecht date: Wed Apr 25 09:28:12 2007 +0200 summary: coorect splitmesh next step changeset: 1139:650460b31c24 user: hecht date: Tue Apr 24 22:20:08 2007 +0200 summary: coorect meshsplit function changeset: 1138:d4553b50a958 user: hecht date: Tue Apr 24 17:18:50 2007 +0200 summary: correct the variable ff_testideprog="testhighlight${EXEEXT}" 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) changeset: 1136:db9bb253016b user: hecht date: Sat Apr 21 11:31:01 2007 +0200 summary: correct miss speeling and fig ref/label 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. 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) changeset: 1133:b53c912f5521 user: hecht date: Fri Apr 20 14:56:06 2007 +0200 summary: do autoreconf 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 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 changeset: 1130:0b47aaa265ed user: hecht date: Tue Apr 17 22:34:58 2007 +0200 summary: same next changeset: 1129:8abeb822514a user: hecht date: Tue Apr 17 22:27:49 2007 +0200 summary: same continuing changeset: 1128:b06140d1d045 user: hecht date: Tue Apr 17 22:12:49 2007 +0200 summary: correct fltk configure process on windows 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 changeset: 1126:84e2eb1e36b5 user: hecht date: Tue Apr 17 12:52:28 2007 +0200 summary: *** empty log message *** changeset: 1125:e25d8911cc1e user: hecht date: Tue Apr 17 12:51:00 2007 +0200 summary: add file changeset: 1124:8cf70de5de34 user: hecht date: Tue Apr 17 12:08:26 2007 +0200 summary: remove umfpack directory form src changeset: 1123:86e4e6640342 user: hecht date: Fri Apr 06 17:42:55 2007 +0200 summary: correct regularity, suite. changeset: 1122:27f01e4f3b4e user: hecht date: Fri Apr 06 14:53:20 2007 +0200 summary: regularity mistake, suite. changeset: 1121:ad34308e20bc user: hecht date: Fri Apr 06 13:18:37 2007 +0200 summary: correct impressin of mesh regularity changeset: 1120:f1de13b4c5b0 user: hecht date: Wed Apr 04 21:20:31 2007 +0200 summary: go to version 2.15-1, see innovation file changeset: 1119:436c75d9b870 user: hecht date: Mon Apr 02 11:45:11 2007 +0200 summary: correct examples++-tutorial/sparse-matrix.edp changeset: 1118:3619a30b94c4 user: hecht date: Mon Apr 02 11:36:31 2007 +0200 summary: correct splitmesh with intenals bourdary changeset: 1117:30af445f8cdb user: hecht date: Sun Mar 25 11:41:56 2007 +0200 summary: correct bug in vectorial operation (a+3.14*b) 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 .. changeset: 1115:7f0e033977ed user: hecht date: Sun Mar 11 21:22:17 2007 +0100 summary: correct licence hearder. 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 changeset: 1113:fc8765cc14d9 user: hecht date: Wed Mar 07 13:51:33 2007 +0100 summary: see INNOVATION for detail. 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 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. changeset: 1110:c84d01a8cf8c user: hecht date: Sat Feb 03 15:17:19 2007 +0100 summary: do autoreconf changeset: 1109:1e4907ffb59e user: hecht date: Sat Feb 03 14:25:28 2007 +0100 summary: pass to version 2.13 and changeset: 1108:421db81aaa4c user: hecht date: Wed Jan 24 14:01:39 2007 +0100 summary: correct mistake in function 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 changeset: 1106:0a1b0afe3ade user: hecht date: Wed Jan 10 13:12:16 2007 +0100 summary: add comment 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 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) 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 changeset: 1102:f87ec3ed5e67 user: hecht date: Fri Dec 01 21:03:37 2006 +0100 summary: coorect LaplaceRT.edp changeset: 1101:e7de74fdbf14 user: hecht date: Thu Nov 30 14:48:47 2006 +0100 summary: correct dependance in examples++-load/Makefile.am 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. 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 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. changeset: 1097:593603d24fae user: hecht date: Mon Nov 06 13:55:03 2006 +0100 summary: correct -Wall continuing 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 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 changeset: 1094:b591f599d49c user: hecht date: Thu Oct 26 14:17:41 2006 +0200 summary: correct mistake in configure 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) changeset: 1092:3e64d9ef3137 user: hecht date: Tue Oct 24 21:22:19 2006 +0200 summary: add flags -with-lapack in configure changeset: 1091:3b882c3a5cbc user: hecht date: Fri Oct 20 11:26:41 2006 +0200 summary: add HIDDEN PARAMETER to fortran route with character parameters changeset: 1090:15d919e17d54 user: hecht date: Thu Oct 19 15:53:21 2006 +0200 summary: coorect 70 in 70. changeset: 1089:72ba19f26d06 user: hecht date: Thu Oct 19 15:13:18 2006 +0200 summary: misa a jour de README_CVS changeset: 1088:7c13736478ae user: hecht date: Wed Oct 18 21:39:17 2006 +0200 summary: ATTENTION le serveur CVS a change changeset: 1087:69aece617a96 user: hecht date: Wed Oct 18 21:28:11 2006 +0200 summary: correct configure.ac for MacOs compile changeset: 1086:c0904d3ddd12 user: hecht date: Wed Oct 11 18:23:32 2006 +0200 summary: change version 2.10-1 changeset: 1085:bfc0a8074e1e user: hecht date: Tue Oct 10 20:48:02 2006 +0200 summary: add modif in the doc changeset: 1084:388005cc5029 user: hecht date: Tue Oct 10 17:42:15 2006 +0200 summary: QF continuing changeset: 1083:7276e657cb50 user: hecht date: Tue Oct 10 17:35:27 2006 +0200 summary: add QF gauss Legendre 4 and 5 points changeset: 1082:b23f3adc267f user: hecht date: Fri Sep 29 22:30:15 2006 +0200 summary: change in all source file the LGPL flags. (FH) changeset: 1081:f945df94b59a user: hecht date: Wed Sep 20 10:23:07 2006 +0200 summary: correct tool with crimson editor under Windows changeset: 1080:586e679e834b user: hecht date: Wed Sep 20 10:19:13 2006 +0200 summary: coorect comment on crimson editor changeset: 1079:ee0cfa566d11 user: hecht date: Tue Sep 19 22:08:51 2006 +0200 summary: bluid HISTORY files changeset: 1078:b224a55c4a5c user: hecht date: Tue Sep 19 21:36:43 2006 +0200 summary: correct openmpi trouble (async communication) changeset: 1077:11c495eb71a5 user: hecht date: Tue Sep 19 17:07:07 2006 +0200 summary: update INNIVATION changeset: 1076:a03f49afc8f3 user: hecht date: Tue Sep 19 16:24:13 2006 +0200 summary: change include.tar.gz file changeset: 1075:0c543fd2904e user: hecht date: Tue Sep 19 16:02:29 2006 +0200 summary: add format output routine changeset: 1074:5f55497120c9 user: hecht date: Tue Sep 19 11:47:20 2006 +0200 summary: correct configure.ac changeset: 1073:e174a3df647c user: hecht date: Mon Sep 18 17:41:24 2006 +0200 summary: change under windows OS the installed files changeset: 1072:3c866007d12c user: hecht date: Fri Jul 21 18:35:12 2006 +0200 summary: passe to version 2.8-2 changeset: 1071:11a7f799060e user: hecht date: Fri Jul 21 17:02:18 2006 +0200 summary: correct bug with mpi (MPICH-2) changeset: 1070:67582bf9db8d user: hecht date: Fri Jun 30 11:16:30 2006 +0200 summary: add print in arpack error changeset: 1069:9d5182230173 user: hecht date: Wed Jun 28 18:01:28 2006 +0200 summary: add missing file in make dist process changeset: 1068:7ac9ef62d6ea user: hecht date: Wed Jun 28 17:50:29 2006 +0200 summary: *** empty log message *** changeset: 1067:7a7da3aac6d0 user: hecht date: Wed Jun 28 17:49:40 2006 +0200 summary: add missing file changeset: 1066:e8c85aa01607 user: hecht date: Wed Jun 28 17:46:39 2006 +0200 summary: add tool to remove cadna in ./configure -without-cadna changeset: 1065:1cdc9b656cbd user: hecht date: Tue Jun 27 23:24:41 2006 +0200 summary: do correction for openmpi but the changeset: 1064:2a1df2d56b69 user: hecht date: Tue Jun 27 23:14:28 2006 +0200 summary: version 2.6-1 changeset: 1063:83aaaf11d8e4 user: hecht date: Fri Jun 16 16:04:45 2006 +0200 summary: correct doc netx step. changeset: 1062:c9d7a4cbb447 user: hecht date: Fri Jun 16 13:49:56 2006 +0200 summary: coorect lame.edp in chap 3 of the doc. changeset: 1061:63490a1bc9e2 user: hecht date: Mon Jun 12 21:15:22 2006 +0200 summary: add correction from christophe.trophime@grenoble.cnrs.fr 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 changeset: 1059:c34152d230f8 user: hecht date: Tue May 30 15:37:52 2006 +0200 summary: correct OpenGL flag under MacOS configure.ac changeset: 1058:fa234b7279ba user: hecht date: Fri May 26 16:57:12 2006 +0200 summary: correct FLIBS in configure.ac changeset: 1057:9f5e47d47b0b user: hecht date: Wed May 24 22:25:02 2006 +0200 summary: correct configure.ac changeset: 1056:ee44b7d37064 user: hecht date: Fri May 19 19:53:09 2006 +0200 summary: cleanning FLIBS configure variable in case of g77 changeset: 1055:7d8c1d27e6a5 user: hecht date: Thu May 18 16:48:17 2006 +0200 summary: correct small error for New macOS install changeset: 1054:d3077251497e user: hecht date: Thu May 18 14:04:09 2006 +0200 summary: correct for lam mpi changeset: 1053:a5ae3f5ad14a user: hecht date: Thu May 18 13:59:15 2006 +0200 summary: add missing file changeset: 1052:271e5d7d4887 user: hecht date: Thu May 18 13:57:25 2006 +0200 summary: correct INNOVATION 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. changeset: 1050:2d93d1eb482c user: hecht date: Wed May 17 15:35:19 2006 +0200 summary: add missing file in distribution changeset: 1049:a35c824f162c user: hecht date: Tue May 16 15:09:18 2006 +0200 summary: remove missing speel in configure.ac 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 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 changeset: 1046:5c045c7b0278 user: hecht date: Fri May 05 22:55:05 2006 +0200 summary: do correction geometric data base with RequiredEdge. changeset: 1045:240f50061d02 user: hecht date: Wed Apr 26 14:15:13 2006 +0200 summary: correct configure.ac : changeset: 1044:68823e1bad2c user: hecht date: Sat Apr 15 18:05:11 2006 +0200 summary: correct missing spellibg line 920 changeset: 1043:a57bd667419c user: hecht date: Sat Apr 15 12:00:58 2006 +0200 summary: correct probele when compioling with g++ 3.2 changeset: 1042:6d6e6646b914 user: hecht date: Thu Apr 13 18:36:42 2006 +0200 summary: correct the mpi version for macos lam mpi 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 changeset: 1040:b08ffa6fe703 user: hecht date: Thu Apr 13 10:27:20 2006 +0200 summary: coorect misstake in rc/femlib/FESpace.cpp changeset: 1039:2cad75a9fee1 user: hecht date: Thu Apr 13 08:37:40 2006 +0200 summary: correct trouble in Boundary condition when we mixte some 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 changeset: 1037:e763b1a14153 user: hecht date: Wed Apr 12 12:59:38 2006 +0200 summary: add line un INNOTAVION 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 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. changeset: 1034:9b67a868ae97 user: hecht date: Tue Apr 11 23:26:57 2006 +0200 summary: correct load.link script (change list of ff++ dll) 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 changeset: 1032:2baa47074ee1 user: hecht date: Tue Apr 11 21:57:50 2006 +0200 summary: correct bug under window in Mesh:Find (very rare) changeset: 1031:6c3bf2dfe726 user: hecht date: Tue Apr 11 13:52:41 2006 +0200 summary: change for window free/delete pair 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) changeset: 1029:4e24126f9014 user: hecht date: Mon Apr 10 22:53:34 2006 +0200 summary: next. changeset: 1028:a15790716999 user: hecht date: Mon Apr 10 22:51:52 2006 +0200 summary: dur dur Windows,  changeset: 1027:254d30ab0f69 user: hecht date: Mon Apr 10 06:59:46 2006 +0200 summary: continuing malloc/free for window changeset: 1026:a5c82bb112b0 user: hecht date: Sun Apr 09 22:19:13 2006 +0200 summary: suite?? changeset: 1025:5a8765108bc6 user: hecht date: Sun Apr 09 21:50:04 2006 +0200 summary: suite, .. changeset: 1024:ef63561dbb98 user: hecht date: Sun Apr 09 20:56:27 2006 +0200 summary: in progress malloc/free ?? changeset: 1023:7c8d3752a8c5 user: hecht date: Sun Apr 09 20:38:50 2006 +0200 summary: try find pair of malloc /free for windows .dll 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 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 changeset: 1020:02ee34e0fedd user: hecht date: Fri Apr 07 08:35:18 2006 +0200 summary: CheckPtr add flag when deleting after cleanning changeset: 1019:f22016768b22 user: hecht date: Thu Apr 06 18:19:09 2006 +0200 summary: remove impression changeset: 1018:eea8603b5314 user: hecht date: Thu Apr 06 16:59:16 2006 +0200 summary: add cfloat include changeset: 1017:c31a741e4f51 user: hecht date: Thu Apr 06 16:53:29 2006 +0200 summary: add missing include climits in src/femlib/fem.cpp changeset: 1016:c8c3fd920434 user: hecht date: Thu Apr 06 16:49:04 2006 +0200 summary: correct mistake in interpolation procedure, (in Mesh::Find methode) 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 ) changeset: 1014:d2487f969c54 user: hecht date: Tue Apr 04 11:25:56 2006 +0200 summary: coorect consistance beetween movmesh and checkmovemesh 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 changeset: 1012:4f0626a95678 user: hecht date: Mon Apr 03 22:39:59 2006 +0200 summary: correct misspelling changeset: 1011:a4f1420b9b02 user: hecht date: Mon Apr 03 22:11:53 2006 +0200 summary: pass to 2.5-1 changeset: 1010:dd65ef6ffe6a user: hecht date: Mon Apr 03 22:09:30 2006 +0200 summary: correct randon error on window 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 changeset: 1008:3c9f1d10e3fa user: hecht date: Sun Apr 02 21:53:41 2006 +0200 summary: and bamg and string_def.o files changeset: 1007:41d7de398a7a user: hecht date: Sat Apr 01 17:41:34 2006 +0200 summary: add new example AdaptResidualErrorIndicator in the doc changeset: 1006:33c7dcaed492 user: hecht date: Fri Mar 31 23:15:22 2006 +0200 summary: add ResidualErrorIndicor example changeset: 1005:c50260b490c6 user: hecht date: Fri Mar 31 20:41:41 2006 +0200 summary: add 2 files changeset: 1004:0a924b0705c0 user: hecht date: Fri Mar 31 18:26:21 2006 +0200 summary: add string method and correct bug une string parameter. changeset: 1003:6d7e5f19e5d2 user: hecht date: Thu Mar 30 08:50:11 2006 +0200 summary: some optimization on new auto free ptr. 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. changeset: 1001:b6f1f5a20727 user: hecht date: Wed Mar 29 14:49:33 2006 +0200 summary: pass to version 2.5-0 changeset: 1000:05c49f7d003b user: hecht date: Wed Mar 29 14:47:52 2006 +0200 summary: * add automatic gestion of free language pointeur to correct 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 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/ changeset: 997:a7c4994c838c user: hecht date: Mon Mar 27 21:25:40 2006 +0200 summary: * add lot missing vectorial operation with sub array changeset: 996:2a1d5b8a2972 user: hecht date: Mon Mar 20 18:10:38 2006 +0100 summary: add init of array with a linear form. changeset: 995:8286c03feec4 user: hecht date: Fri Mar 17 23:18:34 2006 +0100 summary: add missing operator on sub array (type KN_) 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 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 , .... changeset: 992:2900e40c201d user: hecht date: Thu Mar 16 11:40:10 2006 +0100 summary: add new kind on interplate matrix changeset: 991:45069205c1fe user: hecht date: Mon Mar 13 14:40:55 2006 +0100 summary: correct freefem-doc.tex until page 29 example 6. changeset: 990:83997a02688c user: hecht date: Sun Mar 12 12:10:39 2006 +0100 summary: do autoreconf changeset: 989:29e852c9228c user: hecht date: Sun Mar 12 10:47:07 2006 +0100 summary: change version number changeset: 988:248eeefa3fb8 user: hecht date: Sat Mar 11 18:47:41 2006 +0100 summary: array of matrix work now. changeset: 987:88eabcc9bac4 user: hecht date: Sat Mar 11 09:45:02 2006 +0100 summary: correct error in build array of sparce matrix. changeset: 986:28000cfb291d user: hecht date: Fri Mar 10 18:35:23 2006 +0100 summary: pl with matrix arry -> remove changeset: 985:c4d7606f1b7c user: hecht date: Fri Mar 10 17:46:28 2006 +0100 summary: make big change in the DOC with O. Kavian changeset: 984:0c0790f9714e user: hecht date: Tue Mar 07 20:10:30 2006 +0100 summary: tag release_2_4 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 changeset: 982:1063ba890e3c user: hecht date: Tue Mar 07 17:49:56 2006 +0100 summary: same as previous commit (just on the top dir) changeset: 981:14a915d04752 user: hecht date: Tue Mar 07 17:48:47 2006 +0100 summary: add new operator outer product, change the doc, .... 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 changeset: 979:06e185f16d44 user: hecht date: Fri Mar 03 13:21:39 2006 +0100 summary: *** empty log message *** changeset: 978:c3cf679cbfe9 user: hecht date: Fri Mar 03 13:15:15 2006 +0100 summary: add an exemple with 1D lagrange multiplier. 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 changeset: 976:049d52a39d27 user: lehyaric date: Tue Feb 28 10:18:03 2006 +0100 summary: Debian packaging for version 2.3-2 changeset: 975:b0579ae35da0 user: hecht date: Wed Feb 22 18:12:33 2006 +0100 summary: correct exec on PC changeset: 974:1a6c2c83fa7a user: hecht date: Tue Feb 21 15:08:22 2006 +0100 summary: tag release_2_3_2 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 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. changeset: 971:4a048322f1ac user: hecht date: Thu Feb 09 16:32:06 2006 +0100 summary: add configure examples un README files changeset: 970:8853516f2694 user: hecht date: Thu Feb 09 15:11:50 2006 +0100 summary: correct miss spelling, and error in configure.ac changeset: 969:d3384dd2cf15 user: hecht date: Tue Feb 07 21:32:36 2006 +0100 summary: reglage in the doc, changeset: 968:5512562ea7e2 user: hecht date: Tue Feb 07 20:25:58 2006 +0100 summary: add new example 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. 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 changeset: 965:646090715f8a user: hecht date: Fri Jan 27 22:47:48 2006 +0100 summary: add conf flag in README_WINDOWS 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 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. changeset: 962:8167e2ba058c user: hecht date: Fri Jan 27 18:24:30 2006 +0100 summary: correct PB optim on G4 changeset: 961:10303c0ceeac user: hecht date: Fri Jan 27 16:43:49 2006 +0100 summary: correct PB optim on G5 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 changeset: 959:27b51c168d7d user: hecht date: Fri Jan 27 13:57:18 2006 +0100 summary: remove highlight test is no ide changeset: 958:7a51becb5c7c user: hecht date: Fri Jan 27 11:33:28 2006 +0100 summary: correct pb in installing apple version (zcat -> gunzip -c) changeset: 957:f8c6b851cd72 user: hecht date: Fri Jan 27 10:58:21 2006 +0100 summary: take account of mac intel changeset: 956:a3ac2888e73b user: hecht date: Thu Jan 26 10:16:47 2006 +0100 summary: add comment in configure.ac 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 changeset: 954:2b768b55bef2 user: hecht date: Wed Jan 11 22:22:32 2006 +0100 summary: correct xcode projet + warning 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) 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 changeset: 951:a4bcb6afa861 user: lehyaric date: Fri Jan 06 11:28:38 2006 +0100 summary: Changed ARPACK library reference for static compiling 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 changeset: 949:1ae1db6e007a user: hecht date: Fri Jan 06 10:00:32 2006 +0100 summary: add building of bamg and cvsmsh2 command 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 changeset: 947:a9d0713b4381 user: hecht date: Wed Jan 04 11:37:34 2006 +0100 summary: add read bamg geometry file with buildmesh function. changeset: 946:51f2fa717070 user: hecht date: Wed Jan 04 11:27:06 2006 +0100 summary: add build mesh from bamg geometry changeset: 945:71e91a1c79b1 user: lehyaric date: Wed Jan 04 10:18:26 2006 +0100 summary: New Debian package. changeset: 944:24ff5d45228e user: hecht date: Fri Dec 30 21:13:41 2005 +0100 summary: add forget file distribution 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) changeset: 942:d3e15f0496c5 user: hecht date: Fri Dec 30 12:23:06 2005 +0100 summary: pb global.cpp changeset: 941:893de561be72 user: hecht date: Fri Dec 30 12:02:47 2005 +0100 summary: correct compile error 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 changeset: 939:fe79bc21aee6 user: hecht date: Fri Dec 30 10:57:24 2005 +0100 summary: The search directory of load and include seems ok. 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 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 changeset: 936:ab89a4c85ef9 user: hecht date: Thu Dec 29 08:00:51 2005 +0100 summary: reman NSP1BR.edp in NSP2BRP0.edp changeset: 935:a0a4be528978 user: hecht date: Thu Dec 29 07:59:09 2005 +0100 summary: correct load.link (return compile compile error). changeset: 934:299e4f9ebabb user: hecht date: Thu Dec 29 07:46:23 2005 +0100 summary: add missing files changeset: 933:f07b38bd1772 user: hecht date: Wed Dec 28 15:00:04 2005 +0100 summary: *** empty log message *** 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 changeset: 931:8f09f074b924 user: hecht date: Tue Dec 27 22:26:40 2005 +0100 summary: correct the example++-load test 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 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 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, 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 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 changeset: 925:6b38eb0bdbfb user: hecht date: Fri Dec 09 15:09:43 2005 +0100 summary: do autoreconf changeset: 924:93ba5ee1504b user: hecht date: Fri Dec 09 15:08:02 2005 +0100 summary: correct CCFLAGS in umfpack for test changeset: 923:7b3b757e62c9 user: hecht date: Fri Dec 09 11:34:49 2005 +0100 summary: add number of parameter in OneOperator class to 10 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 changeset: 921:db9963c894a5 user: hecht date: Fri Dec 09 09:36:19 2005 +0100 summary: add missing files in DOPC dist changeset: 920:16437453406f user: lehyaric date: Thu Dec 08 16:56:36 2005 +0100 summary: New Debian package version 2.1-1. changeset: 919:c838c9300480 user: lehyaric date: Thu Dec 08 10:01:47 2005 +0100 summary: Removed option --disable-tagging from configure.ac since @TAGGINGDEPEND@ changeset: 918:13204148cc8d user: hecht date: Thu Dec 08 07:59:02 2005 +0100 summary: correct LIBRARY problem for umfpack Demo changeset: 917:302b77b19c5c user: hecht date: Wed Dec 07 21:40:02 2005 +0100 summary: * correct mistake in quadarture formule in integral computation (nota changeset: 916:1280844b35e8 user: hecht date: Wed Dec 07 17:43:37 2005 +0100 summary: correct problem in umfpack with cblas changeset: 915:e89bd0a8d2d1 user: hecht date: Tue Dec 06 22:10:33 2005 +0100 summary: correct mistake in cblas on configure.ac changeset: 914:3383a8fb2e59 user: hecht date: Tue Dec 06 16:56:31 2005 +0100 summary: add new file 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 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) 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, changeset: 910:589d0d1b27de user: hecht date: Wed Nov 30 13:18:19 2005 +0100 summary: /tmp/cvsBIs12d changeset: 909:8ea662ae978c user: lehyaric date: Tue Nov 29 11:45:03 2005 +0100 summary: Now dlopen() works even when ARPACK is downloaded 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. changeset: 907:88031075ba05 user: hecht date: Wed Nov 23 22:02:27 2005 +0100 summary: add roland correction in the doc. changeset: 906:c8d1e446dddd user: lehyaric date: Wed Nov 23 10:40:26 2005 +0100 summary: Added examples++-chapt3/all.edp into cleanregen.sh 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 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 changeset: 903:ff51ba4da75e user: hecht date: Sat Nov 19 21:53:41 2005 +0100 summary: I just try autoreconf on my new mac. changeset: 902:4a6864be0e52 user: hecht date: Sat Nov 19 21:46:32 2005 +0100 summary: remove the wrong BlackShocle.edp example changeset: 901:aafe6f18031a user: hecht date: Wed Nov 16 11:56:55 2005 +0100 summary: correct the following trouble 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 changeset: 899:79398b5c2b4c user: lehyaric date: Wed Nov 09 15:13:15 2005 +0100 summary: New Debian packaging changeset: 898:af9a5fae5106 user: lehyaric date: Wed Nov 09 15:11:45 2005 +0100 summary: Changed Debian dependency from libfltk1.1c102 to libfltk1.1 changeset: 897:a87ee751e538 user: hecht date: Tue Nov 08 11:26:28 2005 +0100 summary: change in grammar lg.y misplaced ternary operator changeset: 896:6c6798e0e726 user: hecht date: Sun Nov 06 20:36:35 2005 +0100 summary: uodate INNOVATION file 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 changeset: 894:76b1f65a3b90 user: hecht date: Wed Nov 02 22:29:12 2005 +0100 summary: add files changeset: 893:04dd48fbf3d6 user: hecht date: Wed Nov 02 22:06:12 2005 +0100 summary: addinf missing files changeset: 892:b32338c130bd user: hecht date: Wed Nov 02 22:04:13 2005 +0100 summary: correct small mistake in the doc changeset: 891:af006f72e7b8 user: lehyaric date: Wed Nov 02 10:46:14 2005 +0100 summary: New Debian packages changeset: 890:a3a685d549f6 user: hecht date: Tue Nov 01 17:52:59 2005 +0100 summary: correct windows install file and load.link under windows changeset: 889:991fc4be5f2b user: hecht date: Tue Nov 01 17:08:57 2005 +0100 summary: correct problem in array operator /= changeset: 888:c32a725f21b6 user: hecht date: Tue Nov 01 16:55:32 2005 +0100 summary: correct src/bin-win32 Makefile.am 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 changeset: 886:92f491c4331f user: hecht date: Mon Oct 31 22:34:02 2005 +0100 summary: *** empty log message *** changeset: 885:d8267da311f1 user: hecht date: Mon Oct 31 17:45:53 2005 +0100 summary: - Correction de bug UMFPACK resolution complex problem changeset: 884:6c4e84a1a8ac user: hecht date: Sun Oct 30 17:26:35 2005 +0100 summary: *** empty log message *** changeset: 883:0028bacc3e62 user: hecht date: Sun Oct 30 17:06:33 2005 +0100 summary: correct problem in eigen value computation 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 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 changeset: 880:0dde809ed55f user: lehyaric date: Thu Oct 27 17:51:19 2005 +0200 summary: - Improved the way configure finds libXxf86vm.a changeset: 879:c085ef504236 user: hecht date: Fri Oct 21 18:18:09 2005 +0200 summary: Try to correct problem in win32 version changeset: 878:aa56fd6dc7ba user: hecht date: Fri Oct 21 17:27:42 2005 +0200 summary: add .edp file in example++-eigen dir changeset: 877:d45005b94b3d user: lehyaric date: Thu Oct 20 16:22:05 2005 +0200 summary: Compiling with the Cygwin DLL is now OK again changeset: 876:6f055a07e3c3 user: lehyaric date: Thu Oct 20 15:46:22 2005 +0200 summary: configure.ac now dynamically checks for libXxf86vm.a changeset: 875:32d5c81f8e05 user: lehyaric date: Thu Oct 20 11:56:16 2005 +0200 summary: New manual included in Debian packages changeset: 874:c4f11df6192f user: hecht date: Wed Oct 19 16:05:20 2005 +0200 summary: *** empty log message *** changeset: 873:ba8e3a039026 user: hecht date: Wed Oct 19 16:01:24 2005 +0200 summary: correct doc file in Mac vercion changeset: 872:97c5169b06d6 user: hecht date: Wed Oct 19 15:27:56 2005 +0200 summary: add link on Desktop to example changeset: 871:ee0c20283445 user: lehyaric date: Wed Oct 19 15:23:03 2005 +0200 summary: HISTORY update changeset: 870:87b7436af068 user: lehyaric date: Wed Oct 19 15:22:56 2005 +0200 summary: Packaging version 2. changeset: 869:3663c2fee3a6 user: hecht date: Wed Oct 19 14:31:19 2005 +0200 summary: correct misspelling in previous modif changeset: 868:0bd5255c4bd5 user: hecht date: Wed Oct 19 14:20:39 2005 +0200 summary: coorect PB LogoUMPC changeset: 867:2e63a3e9ca9e user: hecht date: Wed Oct 19 14:14:17 2005 +0200 summary: correct overflow in elem mat when assembling skyline matrix changeset: 866:adc2ee0d01fe user: hecht date: Tue Oct 18 17:27:16 2005 +0200 summary: *** empty log message *** changeset: 865:5373ad791840 user: hecht date: Tue Oct 18 13:41:20 2005 +0200 summary: *** empty log message *** 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 changeset: 863:0bb65f785e1f user: hecht date: Tue Oct 18 13:14:21 2005 +0200 summary: correct return type probleme LinearCG changeset: 862:af063a43f41d user: hecht date: Tue Oct 18 11:56:38 2005 +0200 summary: correct same problem when passing array as argument. changeset: 861:15a2ea7f7e31 user: pironnea date: Mon Oct 17 09:54:27 2005 +0200 summary: *** empty log message *** changeset: 860:c484b5dfde1d user: hecht date: Mon Oct 17 07:26:43 2005 +0200 summary: DOC upgrading changeset: 859:c0e097480736 user: hecht date: Sun Oct 16 19:48:40 2005 +0200 summary: correct small listake in window version 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 changeset: 857:46f7d68bc496 user: hecht date: Fri Oct 14 11:52:34 2005 +0200 summary: doc book continuing changeset: 856:12c305f56de6 user: hecht date: Thu Oct 13 16:23:46 2005 +0200 summary: change the title page of the doc for publishing changeset: 855:d3e62fa2a587 user: pironnea date: Thu Oct 13 11:48:28 2005 +0200 summary: *** empty log message *** changeset: 854:5313bf2fd39a user: pironnea date: Thu Oct 13 11:34:36 2005 +0200 summary: *** empty log message *** changeset: 853:128f45f7d2c2 user: hecht date: Wed Oct 12 22:22:47 2005 +0200 summary: *** empty log message *** changeset: 852:221e441ef33a user: hecht date: Wed Oct 12 21:20:57 2005 +0200 summary: add forgotten files changeset: 851:47f4d245d855 user: hecht date: Wed Oct 12 21:09:23 2005 +0200 summary: update HISTORY 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 changeset: 849:09368a95147b user: pironnea date: Wed Oct 12 18:20:27 2005 +0200 summary: *** empty log message *** changeset: 848:9b451b2bff88 user: hecht date: Wed Oct 12 17:50:50 2005 +0200 summary: coorect freefem++doc.tex changeset: 847:60473c6ec0a3 user: hecht date: Wed Oct 12 16:09:25 2005 +0200 summary: just add mising eps file 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 changeset: 845:3cb796a22b5d user: hecht date: Tue Oct 04 20:31:41 2005 +0200 summary: correct small mistake in load.cpp i -> j changeset: 844:2a1740f12cd1 user: hecht date: Tue Oct 04 18:17:48 2005 +0200 summary: change the version number to build new window version. changeset: 843:1d5169284e4c user: hecht date: Tue Oct 04 17:26:58 2005 +0200 summary: correct overflow integer array in elementary martix changeset: 842:cd2ddded3fe8 user: hecht date: Tue Oct 04 11:44:01 2005 +0200 summary: correct small proble in load.cpp changeset: 841:83c6f67e8571 user: hecht date: Tue Sep 27 22:35:41 2005 +0200 summary: correct load.cpp to change suffix and prefix changeset: 840:86a63de90bd6 user: hecht date: Mon Sep 26 18:03:57 2005 +0200 summary: small correction for buildng the Window version 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 changeset: 838:478cefc531be user: hecht date: Fri Sep 23 17:11:31 2005 +0200 summary: version 1.48-1 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 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 changeset: 835:d08a7fe8d64b user: lehyaric date: Wed Sep 21 14:52:28 2005 +0200 summary: Added new examples++-chapt3 directory to Windows distribution changeset: 834:37968b5d3aa4 user: hecht date: Fri Sep 09 15:27:40 2005 +0200 summary: change the reconstruction of strversionnumber.cpp changeset: 833:5ed4006dc572 user: hecht date: Fri Sep 09 15:19:14 2005 +0200 summary: create ref.edp file (empty today) changeset: 832:541c3f59571d user: hecht date: Fri Sep 09 15:17:10 2005 +0200 summary: add examples++-chapt3 stuff changeset: 831:d0b4babe44bc user: hecht date: Fri Sep 09 14:30:50 2005 +0200 summary: add new include file changeset: 830:ec7cf2a5bb56 user: hecht date: Fri Sep 09 13:45:37 2005 +0200 summary: correct missing .esp file in Makefile.am changeset: 829:385fa7cb90cf user: hecht date: Fri Sep 09 13:27:16 2005 +0200 summary: *** empty log message *** changeset: 828:17e148260e7d user: hecht date: Fri Sep 09 13:25:55 2005 +0200 summary: add threehsv.eps file 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++ changeset: 826:908ddb527637 user: hecht date: Tue Aug 30 16:56:27 2005 +0200 summary: correct unmissing print in case of verbosity = 0 . changeset: 825:0a55e1d02298 user: hecht date: Tue Aug 30 14:58:44 2005 +0200 summary: correct color in window version changeset: 824:f54ced8e4821 user: hecht date: Tue Aug 30 13:36:53 2005 +0200 summary: Add tool to change the color table of plot: 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) 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 changeset: 821:8508a9315ab1 user: lehyaric date: Wed Jul 13 13:40:51 2005 +0200 summary: Removed references to undefined class "TheSubFMortars" changeset: 820:546ff9fb4445 user: hecht date: Wed Jul 13 12:10:21 2005 +0200 summary: OK, we can make dll under window. first test 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) 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 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 changeset: 816:5fc7ff0dcbe0 user: hecht date: Tue Jul 05 13:11:24 2005 +0200 summary: change version to 1.47-3 changeset: 815:f62d00cabf0e user: lehyaric date: Tue Jul 05 11:48:44 2005 +0200 summary: Tuning scripts for Debian amd64 packaging 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 changeset: 813:e9430e4f4bac user: lehyaric date: Mon Jul 04 16:42:49 2005 +0200 summary: Removed wrong dynamic linking option bug from configure.ac changeset: 812:edd3b1cd9f6d user: lehyaric date: Mon Jul 04 16:26:14 2005 +0200 summary: Added "-fPIC" in compilation options for 64 bit Linux changeset: 811:e5e1da1b1bfe user: hecht date: Mon Jul 04 15:55:23 2005 +0200 summary: correct problem in antype castting under window 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 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" changeset: 808:152b0171eb45 user: lehyaric date: Mon Jul 04 13:30:16 2005 +0200 summary: Changing packaging procedure to include new FreeFem++-cs binaries changeset: 807:e18fc97ba94a user: lehyaric date: Mon Jul 04 13:28:59 2005 +0200 summary: Changing packaging procedure to include FreeFem++-cs binaries. changeset: 806:6e6d817fee3d user: lehyaric date: Fri Jul 01 17:04:59 2005 +0200 summary: Added 64bit debian package (amd64) 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. changeset: 804:13a708e99d11 user: lehyaric date: Fri Jul 01 14:23:32 2005 +0200 summary: Minor modifications in 'clean' goal. changeset: 803:3973b9916156 user: lehyaric date: Fri Jul 01 12:08:40 2005 +0200 summary: New package (1.47-2) currently being built changeset: 802:93740702390d user: lehyaric date: Fri Jul 01 11:59:51 2005 +0200 summary: Building a new package changeset: 801:507bab956933 user: hecht date: Fri Jul 01 11:43:15 2005 +0200 summary: correct problem with splitmesh with internal boundary changeset: 800:d450da38d40c user: lehyaric date: Fri Jul 01 10:57:28 2005 +0200 summary: Test examples++-tutorial/freeboundary-weak also disabled from regression changeset: 799:447f53a0dbac user: lehyaric date: Fri Jul 01 10:34:10 2005 +0200 summary: Disabling example examples++-tutorial/freeboundary.edp from regression tests changeset: 798:5b0c1d07bccd user: lehyaric date: Thu Jun 30 12:22:20 2005 +0200 summary: Configuration procedure updated with new Cygin/Mingw parameters changeset: 797:93549d7d0176 user: lehyaric date: Thu Jun 30 12:08:30 2005 +0200 summary: Standard libraries locations have changed under Cygwin/Mingw 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) 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 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 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 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 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 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 changeset: 789:f4101f1de341 user: hecht date: Tue Jun 28 11:44:33 2005 +0200 summary: add instruction to copy sub array in array 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 (/* 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 changeset: 786:07e403bc9c4d user: hecht date: Tue Jun 28 10:23:24 2005 +0200 summary: correct trouble in block matrix with transpiose sub matrix changeset: 785:77dc6490a932 user: hecht date: Mon Jun 27 16:23:51 2005 +0200 summary: add tools to build bock matrices like 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 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. changeset: 782:96d9ef496911 user: hecht date: Fri Jun 10 16:33:43 2005 +0200 summary: coorect error in add changeset: 781:bbebd79e4d3d user: hecht date: Fri Jun 10 16:23:11 2005 +0200 summary: correct some spelling error changeset: 780:51598cdf173d user: hecht date: Thu Jun 09 15:48:48 2005 +0200 summary: add computation of eigen value for complex matrix changeset: 779:5a11859ad82a user: hecht date: Thu Jun 02 15:56:06 2005 +0200 summary: correct une function name in Pcrgraph.cpp changeset: 778:60033de30615 user: hecht date: Thu Jun 02 15:02:09 2005 +0200 summary: try to build a dll file continuing. changeset: 777:3a9aa1ef97c4 user: hecht date: Thu Jun 02 13:58:02 2005 +0200 summary: *** empty log message *** changeset: 776:ed24b0f0f4df user: hecht date: Thu Jun 02 13:56:57 2005 +0200 summary: correct doible name (CodeAlloc.cpp) in fflib/Makefile.am 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 changeset: 774:4cca7ee6dfc1 user: hecht date: Wed Jun 01 22:52:42 2005 +0200 summary: Do big modification in rgraph.hpp: changeset: 773:200f008bc381 user: hecht date: Thu May 12 11:16:59 2005 +0200 summary: correct problem of CFMessagePort: bootstrap_register() changeset: 772:6f30a07c0403 user: hecht date: Wed May 11 15:17:06 2005 +0200 summary: cosmetic change in PC version 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) changeset: 770:5864a10636d1 user: hecht date: Wed May 11 10:09:40 2005 +0200 summary: add CXX and CC setting in fltk configure parameters changeset: 769:d9d6bd29c106 user: hecht date: Tue May 10 21:19:18 2005 +0200 summary: add include in some ide files (FH) changeset: 768:de52b6df4ea1 user: hecht date: Wed May 04 22:29:42 2005 +0200 summary: add examples++tutorial/xyf file in window distribution changeset: 767:ec5efeca8fb4 user: hecht date: Wed May 04 22:04:25 2005 +0200 summary: add aile.msh in window distribution 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) changeset: 765:054a01ff942d user: hecht date: Wed May 04 21:13:44 2005 +0200 summary: correct DOC/Makefile.am changeset: 764:62ed86008444 user: hecht date: Wed May 04 21:01:05 2005 +0200 summary: correct the DOC directory and do autoreconf changeset: 763:00dacf8de9d8 user: hecht date: Wed May 04 19:56:36 2005 +0200 summary: clean the DOC directory to build manual-full and 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) changeset: 761:810491481429 user: hecht date: Wed May 04 13:09:15 2005 +0200 summary: do autoreconf to rebuild Makefile.in files 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) changeset: 759:70c5c7c03926 user: hecht date: Tue May 03 16:25:39 2005 +0200 summary: remove pascal in "\p " macos version changeset: 758:ec2b000b022c user: hecht date: Tue May 03 15:12:06 2005 +0200 summary: try to compile with de idm compiler xlc++ changeset: 757:379de2f9fa7d user: hecht date: Mon May 02 10:57:59 2005 +0200 summary: do correction for g++-4.0 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) changeset: 755:f90afd98be49 user: lehyaric date: Fri Apr 22 11:58:39 2005 +0200 summary: Debug checks are ok on Debian Testing 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 changeset: 753:5dec2ffefbd4 user: hecht date: Sat Apr 16 21:36:09 2005 +0200 summary: add tool to solve variationnal inequality changeset: 752:95a33493c392 user: hecht date: Fri Apr 15 22:06:03 2005 +0200 summary: add tools to solve variationnal inequality 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) changeset: 750:3cba4b225729 user: hecht date: Tue Apr 12 18:37:37 2005 +0200 summary: add Modification Kohji Ohtsuka in a manual changeset: 749:1097a5ea6a9b user: hecht date: Tue Apr 12 12:07:29 2005 +0200 summary: add flags to build unionkjack mesh on square changeset: 748:80ebe655fe59 user: lehyaric date: Tue Apr 05 15:08:18 2005 +0200 summary: FreeFem+-ide compiles on MacOS X 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 changeset: 746:74899325800e user: hecht date: Wed Mar 30 11:38:14 2005 +0200 summary: correct name of example blakschol.edp in BlackSchole.edp 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 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/) 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) changeset: 742:5bed47d8b18c user: hecht date: Tue Mar 29 23:13:16 2005 +0200 summary: Big change in code generation alloc (work in progress) changeset: 741:24711fe2923e user: hecht date: Fri Mar 25 17:59:22 2005 +0100 summary: correct bug in trunc function: changeset: 740:73864219f12e user: lehyaric date: Fri Mar 25 14:54:25 2005 +0100 summary: Compiling ok on Linux 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. changeset: 738:1bbb4cafbb9b user: lehyaric date: Thu Mar 17 14:15:31 2005 +0100 summary: Included src/lglib/lg.tab.?pp in cleanregen.sh changeset: 737:8d7e1b3ebe28 user: lehyaric date: Thu Mar 17 14:13:42 2005 +0100 summary: Replaced sem_getvalue() with a separate counter on MacOSX. 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) changeset: 735:31983afb5ba0 user: hecht date: Wed Mar 16 15:37:32 2005 +0100 summary: correct prototype of StrVersionNumber in macrgraf changeset: 734:f1c10c96352d user: lehyaric date: Wed Mar 16 15:05:14 2005 +0100 summary: Updates to the no-F77 no-C configuration 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, changeset: 732:e6c08627d1d6 user: hecht date: Wed Mar 16 12:08:00 2005 +0100 summary: correct error in prototype of StrVersionNumber and 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->) changeset: 730:52c5da835984 user: lehyaric date: Wed Mar 02 11:50:19 2005 +0100 summary: Correcting compilation problem on RedHat 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 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 changeset: 727:59c2e9b5f8a2 user: lehyaric date: Tue Mar 01 16:06:32 2005 +0100 summary: Removed unnecessary #includes 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. changeset: 725:73070a97038f user: lehyaric date: Mon Feb 28 11:40:10 2005 +0100 summary: Now compiling fine on MinGW 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 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. changeset: 722:5b390b867211 user: lehyaric date: Fri Feb 25 10:50:26 2005 +0100 summary: Added new "resize" reserved word into the highlighting grammar. changeset: 721:fb36b11fd57c user: hecht date: Thu Feb 24 21:27:23 2005 +0100 summary: correct the documentation 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) changeset: 719:347d7fdaf605 user: hecht date: Thu Feb 24 15:33:21 2005 +0100 summary: resize of array and matrices, continuing 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: changeset: 717:237af51c2d16 user: hecht date: Thu Feb 24 09:44:21 2005 +0100 summary: correct bug in array of complex FE function like 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 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 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 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". changeset: 712:349dc15fb839 user: lehyaric date: Wed Feb 23 12:45:15 2005 +0100 summary: FreeFem++-cs: grammar-driven syntax highlighting works on changeset: 711:8871b1b4c0bb user: hecht date: Wed Feb 23 10:49:35 2005 +0100 summary: add jump and mean of complex function. 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 changeset: 709:6b9cc14429a3 user: hecht date: Fri Feb 18 18:00:08 2005 +0100 summary: ajoute d'un test d'erreur changeset: 708:c442c6ae9737 user: lehyaric date: Thu Feb 17 16:02:34 2005 +0100 summary: Added new developments changeset: 707:051b3deb6ac4 user: lehyaric date: Thu Feb 17 15:05:22 2005 +0100 summary: Compiles on MacOS X. 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 changeset: 705:ed842e9da7aa user: hecht date: Wed Feb 16 18:13:38 2005 +0100 summary: 3D continuing + truc 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. 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 changeset: 702:caeeecdd92b9 user: hecht date: Fri Feb 11 22:20:32 2005 +0100 summary: complet DOC 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 changeset: 700:c2f60527abb5 user: hecht date: Tue Feb 08 17:26:15 2005 +0100 summary: add 3D stuff in quadtree changeset: 699:42115bed3c70 user: lehyaric date: Tue Feb 08 16:52:02 2005 +0100 summary: Updated TODO list for FreeFem++-cs 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 changeset: 697:b17a41e40e1b user: hecht date: Tue Feb 08 15:18:51 2005 +0100 summary: add buildmesh example with nbvx= named parameter changeset: 696:662cf549f14b user: lehyaric date: Tue Feb 08 14:23:24 2005 +0100 summary: New Debian package 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. 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. changeset: 693:9af00658c499 user: hecht date: Fri Feb 04 15:30:49 2005 +0100 summary: beginning of 3D version 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) 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 changeset: 690:2fabec51e87c user: lehyaric date: Tue Feb 01 14:38:02 2005 +0100 summary: FreeFem++-cs works with fully-blocking sockets on Linux. 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 changeset: 688:010fbaa0c385 user: lehyaric date: Mon Jan 31 15:21:05 2005 +0100 summary: New version number in makefiles. changeset: 687:f06a10e19b98 user: lehyaric date: Mon Jan 31 15:17:51 2005 +0100 summary: Default version number now includes package number. changeset: 686:c9b8132a2529 user: lehyaric date: Mon Jan 31 14:07:13 2005 +0100 summary: Problem with busy waiting under Windows solved. changeset: 685:da3d8c2394e2 user: hecht date: Sat Jan 29 09:56:58 2005 +0100 summary: correct some compile error with g++ 3.4 changeset: 684:4082bdc8cf45 user: lehyaric date: Fri Jan 28 13:27:49 2005 +0100 summary: Windows packaging for new improved socket implementation 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. changeset: 682:d572b516a5ff user: hecht date: Thu Jan 27 19:01:24 2005 +0100 summary: correct ; placement in if ... changeset: 681:e67edeab0092 user: hecht date: Thu Jan 27 18:30:17 2005 +0100 summary: pour mettre les makefile.in ok changeset: 680:e48d92cee32c user: hecht date: Thu Jan 27 18:15:48 2005 +0100 summary: mac install continuing changeset: 679:6a216a159e0c user: hecht date: Thu Jan 27 18:14:20 2005 +0100 summary: mac install continuing changeset: 678:915751728e29 user: hecht date: Thu Jan 27 18:07:16 2005 +0100 summary: continuing coorect of macos application installation changeset: 677:69466588b4f3 user: lehyaric date: Thu Jan 27 17:16:54 2005 +0100 summary: Reorganising socket communication in FreeFem++-cs because of instabilities changeset: 676:132579c00f77 user: lehyaric date: Thu Jan 27 10:59:01 2005 +0100 summary: Drag'n'drop works with Mozilla Firefox for Windows. changeset: 675:f7b2a8606369 user: hecht date: Wed Jan 26 23:34:28 2005 +0100 summary: add .app.tgz of macos application changeset: 674:25c49da9166e user: hecht date: Wed Jan 26 23:31:21 2005 +0100 summary: correct pb dvi pdf in manual.tex changeset: 673:d0c77c71561b user: hecht date: Wed Jan 26 23:25:09 2005 +0100 summary: correct stuff in dist generation changeset: 672:7df608534c4b user: hecht date: Wed Jan 26 23:22:59 2005 +0100 summary: correct problem dvi and pdf chose changeset: 671:29bf3dda976d user: hecht date: Wed Jan 26 17:50:13 2005 +0100 summary: coorect macos X application) 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 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 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 changeset: 667:28c10d87f954 user: hecht date: Thu Jan 20 10:39:37 2005 +0100 summary: correct parameter passing () in macro argument 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 changeset: 665:83ad7c4f24b2 user: hecht date: Mon Jan 10 14:03:31 2005 +0100 summary: add forgotten file .pdf changeset: 664:7e72fe09da35 user: hecht date: Mon Jan 10 12:07:32 2005 +0100 summary: window problem continue changeset: 663:b54ebd871dac user: hecht date: Mon Jan 10 10:41:17 2005 +0100 summary: correct ???? configure.ac under window changeset: 662:f9abd9543d11 user: hecht date: Fri Jan 07 17:05:48 2005 +0100 summary: correct expand string in macro changeset: 661:cb5b6ce9fa18 user: hecht date: Fri Jan 07 15:55:01 2005 +0100 summary: add config.h.in changeset: 660:71ef61f93962 user: lehyaric date: Fri Jan 07 12:25:23 2005 +0100 summary: Cosmetic change 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 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 changeset: 657:27abad54b320 user: hecht date: Wed Jan 05 23:10:20 2005 +0100 summary: update HISTORY file changeset: 656:4de99db8c363 user: hecht date: Wed Jan 05 21:50:59 2005 +0100 summary: correct segmentation violation error if changeset: 655:6a65a4351cc6 user: hecht date: Tue Jan 04 16:58:02 2005 +0100 summary: continuing int1d(Th,3,qfe=qf1pElump)( changeset: 654:bb8f41ed79bf user: hecht date: Tue Jan 04 16:45:19 2005 +0100 summary: add qf1pElump new quadrature formular in int1d() ... changeset: 653:75e427064019 user: hecht date: Wed Dec 29 11:16:11 2004 +0100 summary: add concat operator in macro generation # 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. changeset: 651:be477b2a559c user: lehyaric date: Fri Dec 17 17:22:52 2004 +0100 summary: Windows package including correction for Mingw -mthreads bug changeset: 650:eb12e1fe86d0 user: lehyaric date: Fri Dec 17 15:40:30 2004 +0100 summary: Bug solved: Random crashes in Windows GUI changeset: 649:8b2c0dc489c5 user: lehyaric date: Fri Dec 17 11:17:27 2004 +0100 summary: Change naming conventions in package numbering changeset: 648:2e4307b2394c user: lehyaric date: Thu Dec 16 10:30:07 2004 +0100 summary: Added files to "clean-gen" goal 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 changeset: 646:59b4aded663b user: lehyaric date: Wed Dec 15 17:42:56 2004 +0100 summary: Postscript output in FreeFem++-cs corrected. 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 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 changeset: 643:5915ca34cea8 user: hecht date: Tue Dec 07 17:19:47 2004 +0100 summary: adding change 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 changeset: 641:943560ba14cb user: hecht date: Tue Dec 07 15:46:54 2004 +0100 summary: add pdfsync.sty changeset: 640:574e16fa4580 user: hecht date: Tue Dec 07 15:46:54 2004 +0100 summary: add pdfsync.sty changeset: 639:40a0aa5074d2 user: hecht date: Tue Dec 07 14:40:55 2004 +0100 summary: correct bug in LinearGC changeset: 638:ce9d4f35ccbe user: hecht date: Tue Dec 07 14:40:55 2004 +0100 summary: correct bug in LinearGC changeset: 637:5e92e098a84c user: hecht date: Tue Dec 07 14:40:55 2004 +0100 summary: correct bug in LinearGC changeset: 636:c503ab82d448 user: hecht date: Tue Dec 07 14:40:55 2004 +0100 summary: correct bug in LinearGC changeset: 635:df1fe243e312 user: hecht date: Tue Dec 07 14:40:55 2004 +0100 summary: correct bug in LinearGC 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 changeset: 576:dd814ba4d987 user: lehyaric date: Fri Dec 03 11:48:53 2004 +0100 summary: Wording change changeset: 575:698d11505ca5 user: lehyaric date: Thu Dec 02 13:51:32 2004 +0100 summary: New package for Windows done changeset: 574:eda5ab893d90 user: lehyaric date: Thu Dec 02 13:51:32 2004 +0100 summary: New package for Windows done changeset: 573:655782a256ca user: lehyaric date: Thu Dec 02 13:51:32 2004 +0100 summary: New package for Windows done changeset: 572:7fe59ebb535e user: lehyaric date: Thu Dec 02 13:26:30 2004 +0100 summary: Changed reference value for regression tests changeset: 571:1e0b5bb8a88a user: lehyaric date: Thu Dec 02 13:26:30 2004 +0100 summary: Changed reference value for regression tests changeset: 570:28917d41479d user: lehyaric date: Thu Dec 02 13:26:30 2004 +0100 summary: Changed reference value for regression tests changeset: 569:f4933536ffc4 user: lehyaric date: Thu Dec 02 12:34:13 2004 +0100 summary: Regression tests suite was not running. Corrected. changeset: 568:e9f9444f4eec user: lehyaric date: Thu Dec 02 12:34:13 2004 +0100 summary: Regression tests suite was not running. Corrected. changeset: 567:5c4ed3b5dd9d user: lehyaric date: Thu Dec 02 12:34:13 2004 +0100 summary: Regression tests suite was not running. Corrected. changeset: 566:d8c0ddc9c049 user: lehyaric date: Thu Dec 02 12:24:17 2004 +0100 summary: FreeFem++-cs works on MacOSX (uses named semaphores) changeset: 565:9ab9aa52b004 user: lehyaric date: Thu Dec 02 11:40:45 2004 +0100 summary: X11 shared libraries dependencies removed on Mac OS X changeset: 564:a878e8d06b91 user: lehyaric date: Thu Dec 02 11:40:45 2004 +0100 summary: X11 shared libraries dependencies removed on Mac OS X changeset: 563:fcce285846eb user: lehyaric date: Thu Dec 02 10:12:21 2004 +0100 summary: Added FreeFem++-cs to visual regression tests changeset: 562:d740179bde14 user: lehyaric date: Thu Dec 02 10:12:21 2004 +0100 summary: Added FreeFem++-cs to visual regression tests 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) 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) 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) 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) 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) 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 changeset: 555:b9e70adbbe36 user: lehyaric date: Tue Nov 30 17:18:15 2004 +0100 summary: Application icons now work on Windows changeset: 554:8fc116e186d6 user: hecht date: Tue Nov 30 17:08:59 2004 +0100 summary: change 1 un 1. du to complex varf (ambiguity) changeset: 553:8838777e7a31 user: hecht date: Tue Nov 30 17:00:57 2004 +0100 summary: correct small compile error changeset: 552:c187b5186fe1 user: lehyaric date: Tue Nov 30 13:43:12 2004 +0100 summary: Added X-Windows icon to FreeFem++-cs changeset: 551:b157b8570234 user: hecht date: Mon Nov 29 22:23:28 2004 +0100 summary: Correction dans matrixinterpole changeset: 550:cb5e794dd229 user: hecht date: Mon Nov 29 22:23:28 2004 +0100 summary: Correction dans matrixinterpole changeset: 549:f3c219716b61 user: hecht date: Mon Nov 29 22:23:28 2004 +0100 summary: Correction dans matrixinterpole changeset: 548:38b6ad03bc0a user: hecht date: Mon Nov 29 22:23:28 2004 +0100 summary: Correction dans matrixinterpole changeset: 547:aaa46419f2f2 user: hecht date: Mon Nov 29 22:23:28 2004 +0100 summary: Correction dans matrixinterpole changeset: 546:a1b12d942392 user: lehyaric date: Fri Nov 26 16:54:09 2004 +0100 summary: New debian package (1.44-8) 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 changeset: 544:decd403ecbfc user: lehyaric date: Fri Nov 26 15:18:49 2004 +0100 summary: Windows packaging modified to improve icons management changeset: 543:2bd172a33dc9 user: lehyaric date: Fri Nov 26 15:18:49 2004 +0100 summary: Windows packaging modified to improve icons management changeset: 542:a204e168b37a user: lehyaric date: Fri Nov 26 11:15:21 2004 +0100 summary: Including FreeFem++-cs in the Windows packaging changeset: 541:4392d747f871 user: lehyaric date: Thu Nov 25 16:25:05 2004 +0100 summary: FreeFem++-cs compiles on Windows _without_ Cygwin changeset: 540:16055790185c user: lehyaric date: Thu Nov 25 10:35:48 2004 +0100 summary: Recompiled on Linux (Debian unstable). 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) 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) changeset: 537:052a46e28339 user: lehyaric date: Tue Nov 23 16:51:22 2004 +0100 summary: We need cygwin1.dll for FreeFem++-cs changeset: 536:e51479949d96 user: lehyaric date: Tue Nov 23 16:39:56 2004 +0100 summary: FreeFem++-cs works on Windows changeset: 535:c842a897de0b user: lehyaric date: Tue Nov 23 11:06:29 2004 +0100 summary: Cosmetic changes 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 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 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 changeset: 531:c4392eca0236 user: lehyaric date: Mon Nov 22 15:09:18 2004 +0100 summary: New Linux binary package 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 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 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 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 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 changeset: 525:48e68d852cb9 user: lehyaric date: Fri Nov 19 12:29:07 2004 +0100 summary: Added rules to create a Debian package with mpich changeset: 524:824d648c04a3 user: lehyaric date: Fri Nov 19 12:29:07 2004 +0100 summary: Added rules to create a Debian package with mpich changeset: 523:a5edb3078853 user: lehyaric date: Fri Nov 19 10:57:49 2004 +0100 summary: More precise build dependencies for Debian package changeset: 522:59f57df9fae0 user: lehyaric date: Thu Nov 18 11:05:11 2004 +0100 summary: Added profiling option for configure.ac 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. 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. 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. changeset: 518:9d89d076190d user: lehyaric date: Wed Nov 17 15:37:02 2004 +0100 summary: Default Debian package set to -x11 changeset: 517:bdf44e6aba20 user: lehyaric date: Wed Nov 17 14:28:50 2004 +0100 summary: Updated IDE TODO list changeset: 516:517c1471cf2e user: lehyaric date: Wed Nov 17 12:13:22 2004 +0100 summary: Debian package (unstable) for FreeFem++ is ready changeset: 515:eaeb26d2dac2 user: lehyaric date: Wed Nov 17 12:13:22 2004 +0100 summary: Debian package (unstable) for FreeFem++ is ready changeset: 514:721ef4ae9791 user: lehyaric date: Tue Nov 16 17:18:16 2004 +0100 summary: Debian packages curently being built. Not fully operational yet. changeset: 513:48d1d0bda2c4 user: lehyaric date: Tue Nov 16 15:39:50 2004 +0100 summary: Makes doc up-to-date with IDE. 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. 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. 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. 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. 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. 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. 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. 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. 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. changeset: 503:afbb5a9e4183 user: hecht date: Tue Nov 16 09:25:12 2004 +0100 summary: correct problem in integration of complex valued function 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. 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. 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. changeset: 499:e32593c3ce18 user: lehyaric date: Mon Nov 15 13:56:11 2004 +0100 summary: FreeFem++-cs compiles on Cedre (Red-Hat Enterprise) changeset: 498:928f4a1766a4 user: lehyaric date: Mon Nov 15 10:27:44 2004 +0100 summary: Added TODO list for client/server IDE. changeset: 497:ea21be00cbe5 user: hecht date: Mon Nov 15 09:56:56 2004 +0100 summary: orthographe in manual-full changeset: 496:74b4301aac83 user: hecht date: Fri Nov 12 08:31:27 2004 +0100 summary: cadna intergration continuing. changeset: 495:0be17e76a91f user: hecht date: Fri Nov 12 08:31:26 2004 +0100 summary: cadna intergration continuing. changeset: 494:a3d87f2b073c user: hecht date: Fri Nov 12 08:31:26 2004 +0100 summary: cadna intergration continuing. changeset: 493:e43f5465f202 user: hecht date: Fri Nov 12 08:31:26 2004 +0100 summary: cadna intergration continuing. changeset: 492:30be56d8661d user: lehyaric date: Thu Nov 11 19:45:49 2004 +0100 summary: Progressively debugging the IDE and making it usable. changeset: 491:e2c6e9ede5d9 user: lehyaric date: Wed Nov 10 20:12:16 2004 +0100 summary: Some corrections for Cygwin configuration of the IDE. changeset: 490:eb18a25a60ea user: lehyaric date: Wed Nov 10 12:38:16 2004 +0100 summary: Integrating Windows+Cygwin changes back into Linux. changeset: 489:11ff79651895 user: lehyaric date: Wed Nov 10 10:48:49 2004 +0100 summary: *** empty log message *** 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 changeset: 487:5d76a60fb602 user: hecht date: Tue Nov 09 16:23:12 2004 +0100 summary: add interface with cadna changeset: 486:17496d99e45f user: lehyaric date: Tue Nov 09 15:47:10 2004 +0100 summary: Windows version of FreeFem++ client/server IDE currently being changeset: 485:6290d8ecd8c1 user: lehyaric date: Tue Nov 09 15:47:10 2004 +0100 summary: Windows version of FreeFem++ client/server IDE currently being changeset: 484:f926e0479ac8 user: lehyaric date: Tue Nov 09 15:47:10 2004 +0100 summary: Windows version of FreeFem++ client/server IDE currently being 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. 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. changeset: 481:fb4eebbf4886 user: lehyaric date: Mon Nov 08 15:02:28 2004 +0100 summary: First stable version for the Integrated Development Environment changeset: 480:3c1e6d4bc2a2 user: lehyaric date: Mon Nov 08 15:02:28 2004 +0100 summary: First stable version for the Integrated Development Environment changeset: 479:6a6dfeccf617 user: lehyaric date: Mon Nov 08 15:02:28 2004 +0100 summary: First stable version for the Integrated Development Environment changeset: 478:fca74d661274 user: lehyaric date: Mon Nov 08 15:02:28 2004 +0100 summary: First stable version for the Integrated Development Environment changeset: 477:6f5f852316f2 user: lehyaric date: Mon Nov 08 15:02:28 2004 +0100 summary: First stable version for the Integrated Development Environment 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 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 changeset: 474:15a22358864b user: hecht date: Fri Nov 05 17:22:45 2004 +0100 summary: rm ./FreeFem++.app/Contents/Resources/Contents/Info.plist changeset: 473:78d50e8ca9b3 user: hecht date: Fri Nov 05 15:01:51 2004 +0100 summary: add install www files changeset: 472:deb301bad9ed user: hecht date: Fri Nov 05 15:01:51 2004 +0100 summary: add install www files changeset: 471:d329085d2ad9 user: hecht date: Fri Nov 05 15:01:51 2004 +0100 summary: add install www files changeset: 470:b469c835a383 user: hecht date: Thu Nov 04 11:05:46 2004 +0100 summary: small modif for the look changeset: 469:ab1f51259bd0 user: hecht date: Thu Nov 04 10:38:27 2004 +0100 summary: corret small problem in LinearCG LinearGMRES changeset: 468:1acbc778abf2 user: hecht date: Thu Nov 04 10:38:27 2004 +0100 summary: corret small problem in LinearCG LinearGMRES changeset: 467:0ab12962b0fd user: hecht date: Thu Nov 04 10:38:27 2004 +0100 summary: corret small problem in LinearCG LinearGMRES changeset: 466:f7e922b5c47b user: hecht date: Thu Nov 04 10:38:27 2004 +0100 summary: corret small problem in LinearCG LinearGMRES changeset: 465:7538f84816f9 user: hecht date: Thu Nov 04 10:38:27 2004 +0100 summary: corret small problem in LinearCG LinearGMRES changeset: 464:c7ebd094ec65 user: hecht date: Mon Nov 01 17:05:20 2004 +0100 summary: continuing regtest changeset: 463:11e517877eef user: hecht date: Mon Nov 01 17:00:51 2004 +0100 summary: correct stability of regtest changeset: 462:dd06f300568d user: hecht date: Mon Nov 01 16:29:42 2004 +0100 summary: correct regtest in examples++ changeset: 461:1683f7035054 user: hecht date: Mon Nov 01 15:22:16 2004 +0100 summary: correct sensibility problem in regtest value changeset: 460:390f8dccddda user: hecht date: Mon Nov 01 15:22:16 2004 +0100 summary: correct sensibility problem in regtest value changeset: 459:3267ae14952a user: hecht date: Mon Nov 01 14:34:06 2004 +0100 summary: beginning of 1.44 version 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. changeset: 457:207421f2a7e8 user: hecht date: Sun Oct 31 21:45:57 2004 +0100 summary: correct probleme in periodic adapted mesh. 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 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 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 changeset: 453:b8318a5e063d user: hecht date: Fri Oct 22 20:55:10 2004 +0200 summary: try correct probleme with sparce_cmatrix.edp on hydre changeset: 452:ee654e2bf51f user: hecht date: Fri Oct 22 17:40:01 2004 +0200 summary: track a bug in complex matrix changeset: 451:1ec19015b7a7 user: hecht date: Fri Oct 22 13:17:13 2004 +0200 summary: correct spelling in Makefile.am changeset: 450:81af913867db user: hecht date: Fri Oct 22 13:13:57 2004 +0200 summary: correct missing file in dist TARGET changeset: 449:4ebc66387841 user: hecht date: Thu Oct 21 23:30:26 2004 +0200 summary: correct LD_LIBRARY_PATH in regtests.sh changeset: 448:ae67b79318c9 user: hecht date: Thu Oct 21 19:53:59 2004 +0200 summary: correct compilation probleme with g++-3.4 changeset: 447:210d3e06f92d user: hecht date: Thu Oct 21 11:04:46 2004 +0200 summary: olve pb of case in filename if figure dir changeset: 446:b5fa749a5bc9 user: hecht date: Thu Oct 21 11:04:46 2004 +0200 summary: olve pb of case in filename if figure dir changeset: 445:76207b73fd90 user: hecht date: Thu Oct 21 11:04:46 2004 +0200 summary: olve pb of case in filename if figure dir changeset: 444:bd6dac9e9094 user: hecht date: Thu Oct 21 10:51:25 2004 +0200 summary: add info in README_CVS update -d changeset: 443:3454b8d74eb1 user: hecht date: Thu Oct 21 10:47:18 2004 +0200 summary: full manual continuing changeset: 442:425302deea0d user: hecht date: Thu Oct 21 10:37:25 2004 +0200 summary: change default manual to manual-full changeset: 441:930731f1e671 user: hecht date: Thu Oct 21 09:56:57 2004 +0200 summary: add forgetted file changeset: 440:90b421243e49 user: hecht date: Thu Oct 21 09:55:46 2004 +0200 summary: correct ps generation n tag changeset: 439:054a6408443f user: hecht date: Thu Oct 21 08:26:40 2004 +0200 summary: correct problem AssembleVarForm compile with -O3 in hydre changeset: 438:10d97062e606 user: lehyaric date: Wed Oct 20 17:26:48 2004 +0200 summary: Updates for building debian packages. changeset: 437:6b4d454f052c user: hecht date: Wed Oct 20 13:52:12 2004 +0200 summary: correct print in UMFPack driver changeset: 436:5d7b015d6b6a user: hecht date: Wed Oct 20 12:01:16 2004 +0200 summary: add inquire of FE space connectivite (see HISTRY file) changeset: 435:77ee9f17989a user: hecht date: Wed Oct 20 12:01:16 2004 +0200 summary: add inquire of FE space connectivite (see HISTRY file) changeset: 434:645fa4d8d41e user: hecht date: Wed Oct 20 12:01:16 2004 +0200 summary: add inquire of FE space connectivite (see HISTRY file) changeset: 433:fe1cf8c01674 user: hecht date: Tue Oct 19 23:31:24 2004 +0200 summary: correct bug in UMFPACK driver changeset: 432:db150de11f10 user: hecht date: Tue Oct 19 23:31:24 2004 +0200 summary: correct bug in UMFPACK driver changeset: 431:086194a0bc97 user: hecht date: Tue Oct 19 23:31:24 2004 +0200 summary: correct bug in UMFPACK driver changeset: 430:143a3895671e user: hecht date: Tue Oct 19 23:31:24 2004 +0200 summary: correct bug in UMFPACK driver changeset: 429:68b5cd5a87d4 user: hecht date: Tue Oct 19 23:31:24 2004 +0200 summary: correct bug in UMFPACK driver changeset: 428:8e95b761bae5 user: hecht date: Wed Oct 13 21:49:56 2004 +0200 summary: correct line numbering probleme (lose the first line) changeset: 427:25a98f711d0b user: hecht date: Wed Oct 13 21:49:56 2004 +0200 summary: correct line numbering probleme (lose the first line) changeset: 426:144820ccdbd5 user: hecht date: Wed Oct 13 18:12:27 2004 +0200 summary: remove accent in GC routine changeset: 425:1732ce8c01d8 user: hecht date: Wed Oct 13 18:12:27 2004 +0200 summary: remove accent in GC routine changeset: 424:1b5098389948 user: hecht date: Tue Oct 12 21:38:18 2004 +0200 summary: reput previous version (wrong test) changeset: 423:5638a3f80a88 user: hecht date: Tue Oct 12 20:59:32 2004 +0200 summary: correct probleme in A*x for full matrix changeset: 422:94c1cfab9672 user: hecht date: Tue Oct 12 07:28:35 2004 +0200 summary: add file src/fflib/lgmat.cpp 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 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 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 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 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 changeset: 416:97e71f66af70 user: hecht date: Fri Oct 08 18:39:13 2004 +0200 summary: complex matrix continuing changeset: 415:f137b9a8fc5c user: hecht date: Fri Oct 08 18:39:13 2004 +0200 summary: complex matrix continuing changeset: 414:ebfebb1ac5fc user: hecht date: Fri Oct 08 18:39:13 2004 +0200 summary: complex matrix continuing changeset: 413:04eb8a6f2984 user: hecht date: Fri Oct 08 18:39:13 2004 +0200 summary: complex matrix continuing changeset: 412:a22c9b627343 user: hecht date: Wed Oct 06 22:24:56 2004 +0200 summary: add a pde complex example changeset: 411:a4b5781ae40c user: hecht date: Wed Oct 06 22:22:05 2004 +0200 summary: pde complex , continuing: first test is now working changeset: 410:bcac253cb61b user: hecht date: Wed Oct 06 22:22:05 2004 +0200 summary: pde complex , continuing: first test is now working changeset: 409:8979601bdc85 user: hecht date: Tue Oct 05 21:29:04 2004 +0200 summary: complex pde probleme ( first test) no validation changeset: 408:256c59f10590 user: hecht date: Tue Oct 05 21:29:04 2004 +0200 summary: complex pde probleme ( first test) no validation changeset: 407:7d2cf3182e76 user: hecht date: Tue Oct 05 21:29:04 2004 +0200 summary: complex pde probleme ( first test) no validation changeset: 406:e95d0ba6b7e3 user: hecht date: Tue Oct 05 21:29:04 2004 +0200 summary: complex pde probleme ( first test) no validation changeset: 405:70e5cbe6ea2d user: hecht date: Tue Oct 05 21:29:04 2004 +0200 summary: complex pde probleme ( first test) no validation changeset: 404:44a92d96dedf user: hecht date: Tue Oct 05 21:29:04 2004 +0200 summary: complex pde probleme ( first test) no validation changeset: 403:d6f723e155cb user: hecht date: Tue Oct 05 21:29:04 2004 +0200 summary: complex pde probleme ( first test) no validation changeset: 402:3c4ce746b967 user: lehyaric date: Tue Oct 05 15:30:13 2004 +0200 summary: Added reduced compilation goal "quick" for development purposes. changeset: 401:b2003bc088ca user: hecht date: Mon Oct 04 10:22:29 2004 +0200 summary: add complex edp (continued) changeset: 400:397c36b4b309 user: hecht date: Thu Sep 30 14:50:25 2004 +0200 summary: add complex FE function changeset: 399:887c12889698 user: hecht date: Thu Sep 30 14:50:25 2004 +0200 summary: add complex FE function changeset: 398:2f52a8427674 user: hecht date: Thu Sep 30 14:50:25 2004 +0200 summary: add complex FE function changeset: 397:e83e3edd173f user: hecht date: Thu Sep 30 14:50:25 2004 +0200 summary: add complex FE function changeset: 396:a5d848d61a8c user: hecht date: Thu Sep 30 14:50:25 2004 +0200 summary: add complex FE function changeset: 395:54aee94d12a5 user: hecht date: Thu Sep 30 14:50:25 2004 +0200 summary: add complex FE function changeset: 394:82ccf1be8da9 user: hecht date: Thu Sep 30 14:50:25 2004 +0200 summary: add complex FE function changeset: 393:8057e10dedca user: hecht date: Tue Sep 28 10:58:41 2004 +0200 summary: add new manual call manual-full changeset: 392:6af43ced4bae user: hecht date: Tue Sep 28 10:58:41 2004 +0200 summary: add new manual call manual-full changeset: 391:567799ab94cb user: hecht date: Tue Sep 28 10:58:41 2004 +0200 summary: add new manual call manual-full changeset: 390:abb85c03c031 user: hecht date: Tue Sep 28 10:58:41 2004 +0200 summary: add new manual call manual-full changeset: 389:fe223eb326cd user: hecht date: Tue Sep 28 10:58:40 2004 +0200 summary: add new manual call manual-full changeset: 388:4ca7990a291d user: hecht date: Tue Sep 28 10:58:40 2004 +0200 summary: add new manual call manual-full changeset: 387:933bb1d0a477 user: hecht date: Tue Sep 28 10:58:40 2004 +0200 summary: add new manual call manual-full changeset: 386:5a2434bfc31b user: hecht date: Tue Sep 28 10:58:40 2004 +0200 summary: add new manual call manual-full changeset: 385:72b317a18586 user: hecht date: Tue Sep 28 10:58:40 2004 +0200 summary: add new manual call manual-full changeset: 384:01a48ef68149 user: hecht date: Tue Sep 28 10:58:40 2004 +0200 summary: add new manual call manual-full changeset: 383:dc00fa274e76 user: lehyaric date: Fri Sep 17 17:29:29 2004 +0200 summary: More information about CVS commands. 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 changeset: 381:fc7c2126f5c4 user: lehyaric date: Fri Sep 17 16:13:25 2004 +0200 summary: Regression tests pass again on Macintosh PPC (generic mode). 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). 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). 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). 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). 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 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 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 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 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 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 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. changeset: 369:3b19cf768802 user: lehyaric date: Tue Sep 14 11:39:15 2004 +0200 summary: Corrected bug preventing examples++-tutorial/regtests.m4 from being changeset: 368:fe3f3906e950 user: lehyaric date: Tue Sep 14 11:20:40 2004 +0200 summary: More updates for FreeBSD compilation changeset: 367:c4a119ca5c9a user: lehyaric date: Mon Sep 13 16:05:19 2004 +0200 summary: Modification proposée par Thierry Thomas pour FreeBSD changeset: 366:8493ed2b0f1e user: hecht date: Mon Sep 13 15:33:27 2004 +0200 summary: correct plist version changeset: 365:18b4482e75b8 user: hecht date: Mon Sep 13 15:33:27 2004 +0200 summary: correct plist version 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 changeset: 363:613c6ccc0c5f user: hecht date: Tue Sep 07 17:43:34 2004 +0200 summary: corret of window install changeset: 362:8540f099b3ce user: hecht date: Tue Sep 07 16:47:58 2004 +0200 summary: add file for MacOS application 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 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 changeset: 359:2784c4a0bd47 user: hecht date: Tue Sep 07 09:45:39 2004 +0200 summary: correct with-blas=.... tags changeset: 358:cf165daa0d0f user: hecht date: Tue Sep 07 09:36:07 2004 +0200 summary: add if previous download of blas reuse it changeset: 357:3eb4c46dcfe9 user: hecht date: Tue Sep 07 09:36:07 2004 +0200 summary: add if previous download of blas reuse it changeset: 356:76b709dff400 user: hecht date: Tue Sep 07 09:36:07 2004 +0200 summary: add if previous download of blas reuse it changeset: 355:5e3635850187 user: hecht date: Tue Sep 07 09:36:07 2004 +0200 summary: add if previous download of blas reuse it changeset: 354:31bc7672aa7c user: hecht date: Tue Sep 07 09:36:07 2004 +0200 summary: add if previous download of blas reuse it 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 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) changeset: 351:44f079ca1e54 user: hecht date: Fri Sep 03 10:45:06 2004 +0200 summary: empty SOURCESS variable in download/blas/Makefile.am because changeset: 350:1e46b370a8e8 user: hecht date: Thu Sep 02 16:04:15 2004 +0200 summary: *** empty log message *** changeset: 349:aa868ed8a653 user: hecht date: Thu Sep 02 16:04:15 2004 +0200 summary: *** empty log message *** changeset: 348:ea558c405714 user: hecht date: Thu Sep 02 16:04:15 2004 +0200 summary: *** empty log message *** changeset: 347:e93fad9806ee user: hecht date: Thu Sep 02 16:04:15 2004 +0200 summary: *** empty log message *** changeset: 346:699d36073a62 user: hecht date: Wed Sep 01 13:51:05 2004 +0200 summary: correct string[string] undelete pointer changeset: 345:3630bf06e805 user: hecht date: Wed Sep 01 13:51:05 2004 +0200 summary: correct string[string] undelete pointer changeset: 344:1f080b312de7 user: hecht date: Wed Sep 01 13:51:05 2004 +0200 summary: correct string[string] undelete pointer changeset: 343:2207149cc212 user: hecht date: Wed Sep 01 09:33:21 2004 +0200 summary: expand macro problem , suite (et fin?) changeset: 342:7f3e2e94c5dd user: hecht date: Wed Sep 01 09:33:21 2004 +0200 summary: expand macro problem , suite (et fin?) changeset: 341:5155e427a87d user: hecht date: Wed Sep 01 07:41:07 2004 +0200 summary: correct pb in macro generation (not finish) changeset: 340:c43b8c2be26a user: hecht date: Tue Aug 31 17:35:35 2004 +0200 summary: correct bug in macro expansion changeset: 339:ffcff5636f12 user: hecht date: Mon Aug 30 17:10:10 2004 +0200 summary: remove blas call on MacOS 9 changeset: 338:531a39f19f63 user: hecht date: Mon Aug 30 15:56:07 2004 +0200 summary: add blas call in choleski and LU solver changeset: 337:4fbef75b9c75 user: hecht date: Mon Aug 30 15:56:07 2004 +0200 summary: add blas call in choleski and LU solver changeset: 336:411e79c1f3d1 user: hecht date: Mon Aug 30 15:56:07 2004 +0200 summary: add blas call in choleski and LU solver changeset: 335:db4ae64b21ff user: hecht date: Mon Aug 30 14:13:24 2004 +0200 summary: add blas in choleski changeset: 334:a2136058155e user: hecht date: Mon Aug 30 14:13:24 2004 +0200 summary: add blas in choleski changeset: 333:3026860a14e7 user: hecht date: Mon Aug 30 14:13:24 2004 +0200 summary: add blas in choleski 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 changeset: 331:d25cf7233e27 user: hecht date: Mon Aug 30 13:40:48 2004 +0200 summary: correction to by compatible wiath g++-3.4 changeset: 330:2053e59afe11 user: hecht date: Mon Aug 30 13:40:48 2004 +0200 summary: correction to by compatible wiath g++-3.4 changeset: 329:de5ee8de0427 user: hecht date: Fri Aug 27 17:42:26 2004 +0200 summary: correct g++-3.4 compilation probleme changeset: 328:5a1f1387f099 user: hecht date: Thu Aug 26 16:51:56 2004 +0200 summary: optimize cpu times on choleski and crout changeset: 327:c28bfd60ba97 user: hecht date: Thu Aug 26 15:04:49 2004 +0200 summary: correct divide by zero in plot changeset: 326:82e0b4315486 user: hecht date: Thu Aug 26 15:04:49 2004 +0200 summary: correct divide by zero in plot changeset: 325:cf3cb8ac4aff user: hecht date: Thu Aug 26 15:04:49 2004 +0200 summary: correct divide by zero in plot changeset: 324:03ff6dc560d5 user: hecht date: Thu Aug 26 15:04:49 2004 +0200 summary: correct divide by zero in plot changeset: 323:1a52cee5c2df user: hecht date: Thu Aug 26 15:04:49 2004 +0200 summary: correct divide by zero in plot changeset: 322:0aa1b06eb0ef user: lehyaric date: Fri Jul 16 14:40:18 2004 +0200 summary: Windows package for Version 1.41 complete. changeset: 321:1fe712bb592c user: lehyaric date: Fri Jul 16 14:40:18 2004 +0200 summary: Windows package for Version 1.41 complete. changeset: 320:def90fb6ed3d user: lehyaric date: Fri Jul 16 14:40:18 2004 +0200 summary: Windows package for Version 1.41 complete. changeset: 319:bf9d235a46b3 user: lehyaric date: Fri Jul 16 14:40:18 2004 +0200 summary: Windows package for Version 1.41 complete. changeset: 318:85f578ad260e user: lehyaric date: Fri Jul 16 14:40:18 2004 +0200 summary: Windows package for Version 1.41 complete. changeset: 317:6628af52db2b user: lehyaric date: Thu Jul 15 10:32:08 2004 +0200 summary: Regression tests ok on an Athlon 1.2 GHz. changeset: 316:53712bc8f199 user: lehyaric date: Tue Jul 13 14:20:36 2004 +0200 summary: Regression tests pass on cygwin. changeset: 315:8ea214d54ae7 user: lehyaric date: Tue Jul 13 11:13:06 2004 +0200 summary: Small comment change. 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). 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). changeset: 312:d2475c116bac user: lehyaric date: Tue Jul 13 11:01:50 2004 +0200 summary: Optimized BLAS replaced with generic BLAS for generic compilation. changeset: 311:9d99b39cf9d4 user: lehyaric date: Tue Jul 13 10:29:57 2004 +0200 summary: Duplicates xerbla.f when downloading generic blas. 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 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 changeset: 308:b9a134a6f6e2 user: lehyaric date: Fri Jul 09 18:10:16 2004 +0200 summary: New script to upload Debian packages. changeset: 307:db4e0b9fb8e6 user: lehyaric date: Fri Jul 09 18:10:16 2004 +0200 summary: New script to upload Debian packages. changeset: 306:fcea44571ff4 user: darrasse date: Fri Jul 09 16:52:17 2004 +0200 summary: Mise à jour de la liste des auteurs changeset: 305:a518d55630cf user: lehyaric date: Fri Jul 09 10:04:55 2004 +0200 summary: Binary ATLAS download disabled for the moment. changeset: 304:e8c7b5754d95 user: hecht date: Thu Jul 08 15:31:42 2004 +0200 summary: install-www in progress 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, 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, 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, changeset: 300:470d4053c3da user: hecht date: Thu Jul 08 15:21:08 2004 +0200 summary: correct install-www 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. 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. 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. 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 changeset: 295:fefc602af266 user: lehyaric date: Thu Jul 08 10:44:43 2004 +0200 summary: Debian binary packages created, but not tested yet. changeset: 294:2269542083d4 user: lehyaric date: Wed Jul 07 17:42:54 2004 +0200 summary: Debian packaging in progress. changeset: 293:5fa437bd58d9 user: lehyaric date: Wed Jul 07 17:42:54 2004 +0200 summary: Debian packaging in progress. changeset: 292:3c887a990870 user: hecht date: Wed Jul 07 16:25:04 2004 +0200 summary: correction on macosX version changeset: 291:a2af1c655832 user: hecht date: Wed Jul 07 16:25:04 2004 +0200 summary: correction on macosX version changeset: 290:e6ecf315812d user: hecht date: Wed Jul 07 16:25:04 2004 +0200 summary: correction on macosX version changeset: 289:c51cd2b05332 user: hecht date: Wed Jul 07 15:56:15 2004 +0200 summary: correct pb in freefem++.app on macosX changeset: 288:e142da063d15 user: hecht date: Wed Jul 07 15:13:27 2004 +0200 summary: correct install-www script changeset: 287:ab379a17cf2e user: hecht date: Wed Jul 07 14:40:01 2004 +0200 summary: add native9 make target for Mac9 version changeset: 286:6aaa1a3f395f user: hecht date: Wed Jul 07 14:29:05 2004 +0200 summary: correct pb in MACOSX version and instal-www file changeset: 285:28ea7398dafd user: hecht date: Wed Jul 07 14:24:10 2004 +0200 summary: correct path of FreeFem++-CoCoa file in install changeset: 284:8609cad81843 user: hecht date: Wed Jul 07 14:05:51 2004 +0200 summary: Add COPYRIGHT file changeset: 283:1525c53ec559 user: hecht date: Wed Jul 07 13:58:17 2004 +0200 summary: Add INSTALL-MacOS file changeset: 282:94e900430e00 user: lehyaric date: Wed Jul 07 12:51:55 2004 +0200 summary: Debian packaging in progress. changeset: 281:f5220090d815 user: lehyaric date: Wed Jul 07 12:51:55 2004 +0200 summary: Debian packaging in progress. changeset: 280:421a0c5540ec user: hecht date: Wed Jul 07 12:41:05 2004 +0200 summary: mal change in epsilon for regtest (on idared) changeset: 279:0f1c9dc9f21f user: hecht date: Wed Jul 07 12:09:31 2004 +0200 summary: correct pb in m4 parameter for building regtests.edp changeset: 278:669fb7802b66 user: hecht date: Wed Jul 07 11:32:55 2004 +0200 summary: add install-www to set web server changeset: 277:ce3021db6c88 tag: release_1_41_before_packaging user: lehyaric date: Mon Jul 05 14:38:47 2004 +0200 summary: Remove debugging information 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 changeset: 275:82325608c7fa user: lehyaric date: Thu Jul 01 16:04:09 2004 +0200 summary: All regression tests ok on Cedre. changeset: 274:9f94970bb44b user: lehyaric date: Thu Jul 01 16:04:09 2004 +0200 summary: All regression tests ok on Cedre. changeset: 273:2d7625db8ce9 user: lehyaric date: Thu Jul 01 16:04:09 2004 +0200 summary: All regression tests ok on Cedre. changeset: 272:7be0ae88c080 user: lehyaric date: Thu Jul 01 15:33:45 2004 +0200 summary: All regression tests ok on Hydre. changeset: 271:df58e4bd4eda user: lehyaric date: Thu Jul 01 15:33:45 2004 +0200 summary: All regression tests ok on Hydre. changeset: 270:0757f6282056 user: lehyaric date: Thu Jul 01 15:33:45 2004 +0200 summary: All regression tests ok on Hydre. changeset: 269:bd99d82ae56e user: lehyaric date: Thu Jul 01 15:33:45 2004 +0200 summary: All regression tests ok on Hydre. changeset: 268:2e6c9c4611a5 user: lehyaric date: Thu Jul 01 14:26:01 2004 +0200 summary: More updates to make parallel regression tests work. changeset: 267:43dffe189376 user: lehyaric date: Thu Jul 01 14:26:01 2004 +0200 summary: More updates to make parallel regression tests work. changeset: 266:2934f663b1f6 user: lehyaric date: Thu Jul 01 14:26:01 2004 +0200 summary: More updates to make parallel regression tests work. changeset: 265:03a2012d998f user: lehyaric date: Thu Jul 01 14:18:33 2004 +0200 summary: Correcting some problems with parallel regressions tests. 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. changeset: 263:be8728bf6836 user: lehyaric date: Thu Jul 01 13:21:41 2004 +0200 summary: More tests on the parallel version (FreeFem++-mpi) 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 changeset: 261:2b2296d0b03d user: lehyaric date: Wed Jun 30 14:29:48 2004 +0200 summary: New file configure.param containing configure parameters. changeset: 260:74d8cc71c4ba user: lehyaric date: Wed Jun 30 10:47:20 2004 +0200 summary: Describes how to compile FreeFem++ on Windows. 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, 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. 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. 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. 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. 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. 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. changeset: 252:95739d9cec9c user: hecht date: Mon Jun 28 22:02:09 2004 +0200 summary: correct double echo in macro expansion 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 changeset: 225:8be6dcc104ac user: lehyaric date: Mon Jun 28 11:07:54 2004 +0200 summary: Cleaning and improving the MacOS version. changeset: 224:e98a86d4e84a user: lehyaric date: Mon Jun 28 11:07:54 2004 +0200 summary: Cleaning and improving the MacOS version. changeset: 223:4fe29fbcb591 user: lehyaric date: Mon Jun 28 11:07:53 2004 +0200 summary: Cleaning and improving the MacOS version. changeset: 222:11ea2dc80fda user: hecht date: Mon Jun 28 09:41:41 2004 +0200 summary: small correct changeset: 221:803825852848 user: hecht date: Mon Jun 28 09:33:07 2004 +0200 summary: FH correct pb in file name changeset: 220:49f933c9d7c5 user: hecht date: Mon Jun 28 09:29:04 2004 +0200 summary: Correct small thing in DOC and add losed figure changeset: 219:b0b3f7597046 user: hecht date: Mon Jun 28 09:29:04 2004 +0200 summary: Correct small thing in DOC and add losed figure changeset: 218:260856bae4be user: hecht date: Mon Jun 28 09:29:04 2004 +0200 summary: Correct small thing in DOC and add losed figure changeset: 217:d8ebe140a004 user: hecht date: Sun Jun 27 17:18:35 2004 +0200 summary: FH modif .plist file for MacOS application changeset: 216:274201b08277 user: hecht date: Sun Jun 27 17:18:35 2004 +0200 summary: FH modif .plist file for MacOS application changeset: 215:b34523490134 user: hecht date: Sun Jun 27 17:18:35 2004 +0200 summary: FH modif .plist file for MacOS application 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 changeset: 213:d345132caf0d user: hecht date: Fri Jun 25 18:31:20 2004 +0200 summary: FH: add bug example changeset: 212:ed255a0ab2b9 user: hecht date: Fri Jun 25 18:30:14 2004 +0200 summary: FH: compile FLAG optimization on MACOS 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) 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) changeset: 209:566f15d34ead user: lehyaric date: Fri Jun 25 17:30:51 2004 +0200 summary: Making "make visualcheck" work. 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 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. changeset: 206:2a8140e574cd user: hecht date: Fri Jun 25 14:13:56 2004 +0200 summary: add a forgottent & in toString Complex) 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 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. changeset: 203:50b0a79472d0 user: lehyaric date: Fri Jun 25 13:42:27 2004 +0200 summary: Still more corrections to make regtests.sh work. changeset: 202:7350e7f03cb7 user: lehyaric date: Fri Jun 25 12:21:00 2004 +0200 summary: Corrected bug where FreeFem++ command was not correctly constructed changeset: 201:1a97c5f8dae3 user: hecht date: Fri Jun 25 12:17:20 2004 +0200 summary: add periodic adaptmesh stuff changeset: 200:bf6116bf6e14 user: hecht date: Fri Jun 25 12:17:20 2004 +0200 summary: add periodic adaptmesh stuff changeset: 199:f9a372018d4d user: hecht date: Fri Jun 25 12:17:20 2004 +0200 summary: add periodic adaptmesh stuff changeset: 198:173890d6cffd user: hecht date: Fri Jun 25 12:17:20 2004 +0200 summary: add periodic adaptmesh stuff changeset: 197:1ea692423a96 user: hecht date: Fri Jun 25 12:17:20 2004 +0200 summary: add periodic adaptmesh stuff changeset: 196:eafde84d3182 user: hecht date: Fri Jun 25 12:17:20 2004 +0200 summary: add periodic adaptmesh stuff changeset: 195:36fad8e658ca user: hecht date: Fri Jun 25 12:17:20 2004 +0200 summary: add periodic adaptmesh stuff changeset: 194:84be95355842 user: hecht date: Fri Jun 25 12:17:20 2004 +0200 summary: add periodic adaptmesh stuff 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 changeset: 192:5eb924283df1 user: lehyaric date: Fri Jun 25 11:55:15 2004 +0200 summary: Replaced all occurrences of regtests.pl with regtests.sh changeset: 191:5f334f30cf3d user: lehyaric date: Fri Jun 25 11:05:41 2004 +0200 summary: Correcting the definition of VersionFreeFemDate and VersionFreeFempp changeset: 190:46b1668643d5 user: lehyaric date: Fri Jun 25 10:59:16 2004 +0200 summary: More documentation for config-version.h generation. 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 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 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 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 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 changeset: 184:4f7f186b636b user: darrasse date: Thu Jun 24 18:09:06 2004 +0200 summary: Ajout du packet freefem++-doc contenant la documentation changeset: 183:e7ca62ae4d11 user: darrasse date: Thu Jun 24 18:09:06 2004 +0200 summary: Ajout du packet freefem++-doc contenant la documentation changeset: 182:0e82b2a232ce user: darrasse date: Thu Jun 24 18:09:06 2004 +0200 summary: Ajout du packet freefem++-doc contenant la documentation 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. 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. changeset: 179:b4d6436c35bf user: lehyaric date: Thu Jun 24 16:05:39 2004 +0200 summary: Regression tests for the parallel version are ok. changeset: 178:089de7eb3548 user: darrasse date: Thu Jun 24 14:44:46 2004 +0200 summary: Changement de priorité des alternatives. x11 est prioritaire à glx. 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. 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. changeset: 175:fe0ca2334cad user: lehyaric date: Thu Jun 24 12:27:06 2004 +0200 summary: *** empty log message *** changeset: 174:50971f3da918 user: lehyaric date: Thu Jun 24 12:27:06 2004 +0200 summary: *** empty log message *** changeset: 173:e5c1f7c7ce17 user: lehyaric date: Thu Jun 24 11:52:52 2004 +0200 summary: *** empty log message *** 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 changeset: 171:04867a5d5213 user: lehyaric date: Thu Jun 24 10:44:31 2004 +0200 summary: GLX version was not compiled on MacOS X. Corrected. 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. 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. changeset: 168:579a83fef807 user: hecht date: Thu Jun 24 08:09:48 2004 +0200 summary: modif to bee compatible with g++ 3.4 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 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 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. 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 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 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 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 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 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 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 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 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 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 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 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 changeset: 152:56ce98e3dd00 user: lehyaric date: Wed Jun 23 14:04:06 2004 +0200 summary: Regression tests are currently being checked. changeset: 151:0629efd36bdf user: lehyaric date: Wed Jun 23 14:04:06 2004 +0200 summary: Regression tests are currently being checked. changeset: 150:d74e4f965d34 user: lehyaric date: Wed Jun 23 14:04:06 2004 +0200 summary: Regression tests are currently being checked. changeset: 149:ef13ddf7a19d user: lehyaric date: Wed Jun 23 11:36:17 2004 +0200 summary: Mise à jour de la configuration de UMFPACK 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. 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 changeset: 146:b4100d9e3db7 user: lehyaric date: Tue Jun 22 17:12:59 2004 +0200 summary: Optimization ok on PowerPC G5 (Idared) 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) 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) 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) changeset: 142:5a7bc526e492 user: darrasse date: Tue Jun 22 15:32:22 2004 +0200 summary: correction de la détection de UMFPACK changeset: 141:668587ef4273 user: lehyaric date: Tue Jun 22 12:05:59 2004 +0200 summary: Correction minime de l'explication de --enable-debug. changeset: 140:76886e6c7a58 user: lehyaric date: Mon Jun 21 17:06:16 2004 +0200 summary: Optimization ok on Debian/Testing. changeset: 139:06ec58be4aa1 user: hecht date: Mon Jun 21 16:56:55 2004 +0200 summary: *** empty log message *** 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 changeset: 137:ba2a49602ec0 user: lehyaric date: Mon Jun 21 16:24:54 2004 +0200 summary: Parallel version modified to use downloaded UMFPACK if available. changeset: 136:7dd82d676d0d user: lehyaric date: Mon Jun 21 15:53:15 2004 +0200 summary: Some corrections for the "generic" optimization mode. changeset: 135:154e95f0efb4 user: lehyaric date: Mon Jun 21 15:31:16 2004 +0200 summary: Hardware-dependant optimization options currently being selected. changeset: 134:2fc65e06c099 user: hecht date: Mon Jun 21 11:08:16 2004 +0200 summary: add example of test the optimised version changeset: 133:41b3e409ce8d user: hecht date: Mon Jun 21 11:08:16 2004 +0200 summary: add example of test the optimised version changeset: 132:aa3b6d5dea5a user: hecht date: Mon Jun 21 11:08:16 2004 +0200 summary: add example of test the optimised version changeset: 131:ee15f9879bb0 user: lehyaric date: Sun Jun 20 19:58:38 2004 +0200 summary: Optimiztion for Pentium III added. changeset: 130:07ffea2fef49 user: lehyaric date: Sun Jun 20 19:30:28 2004 +0200 summary: Configuration of compiler optimization flags still being developed. 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 changeset: 128:49ecc5ec76f1 user: hecht date: Sat Jun 19 14:23:20 2004 +0200 summary: *** empty log message *** changeset: 127:27909cc2efe4 user: hecht date: Fri Jun 18 17:50:43 2004 +0200 summary: add modif compilation avec gcc 3.4 changeset: 126:eb38cdcad258 user: lehyaric date: Fri Jun 18 10:31:16 2004 +0200 summary: Documentation proofreading ok up to §3.6 included changeset: 125:eebea7c8bada user: lehyaric date: Thu Jun 17 14:34:49 2004 +0200 summary: - Documentation proofreading ok up to §3.6 included changeset: 124:de5ab079f924 user: lehyaric date: Wed Jun 16 14:47:48 2004 +0200 summary: - Removing emacs backup files 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 changeset: 122:4365bece55ed user: hecht date: Wed Jun 16 14:35:38 2004 +0200 summary: *** empty log message *** changeset: 121:b1c8e1f1fbfa user: hecht date: Wed Jun 16 14:32:24 2004 +0200 summary: correction of string argument in macro processing changeset: 120:e8a577e435c5 user: hecht date: Wed Jun 16 14:32:24 2004 +0200 summary: correction of string argument in macro processing changeset: 119:2b3e676ae747 user: hecht date: Wed Jun 16 14:32:24 2004 +0200 summary: correction of string argument in macro processing changeset: 118:3c790a15669c user: hecht date: Wed Jun 16 14:32:24 2004 +0200 summary: correction of string argument in macro processing changeset: 117:4223b571b7a2 user: hecht date: Wed Jun 16 14:32:24 2004 +0200 summary: correction of string argument in macro processing changeset: 116:6d4f0efd7290 user: hecht date: Wed Jun 16 14:32:24 2004 +0200 summary: correction of string argument in macro processing changeset: 115:8830c3e6a420 user: hecht date: Wed Jun 16 14:25:41 2004 +0200 summary: *** empty log message *** changeset: 114:15154662ef97 user: lehyaric date: Tue Jun 15 12:08:37 2004 +0200 summary: Proofreading ok up to §2.3 included. changeset: 113:f3859d20ff80 user: lehyaric date: Thu Jun 10 10:16:17 2004 +0200 summary: - Relecture Anglais documentation: chapitre I ok. changeset: 112:5dfaf78878eb user: lehyaric date: Thu Jun 10 10:16:17 2004 +0200 summary: - Relecture Anglais documentation: chapitre I ok. changeset: 111:d602db40f9df user: lehyaric date: Thu Jun 10 10:16:17 2004 +0200 summary: - Relecture Anglais documentation: chapitre I ok. changeset: 110:85d80f2e6265 user: lehyaric date: Wed Jun 09 10:09:10 2004 +0200 summary: More help on CVS and automake. changeset: 109:66de63c37bce user: lehyaric date: Tue Jun 08 16:10:19 2004 +0200 summary: Relecture anglais doc arrivé au § 1.3 changeset: 108:93fa37e6dc7e user: lehyaric date: Mon Jun 07 16:34:17 2004 +0200 summary: Première relecture des fichiers README et associés. changeset: 107:828ba65d9130 user: lehyaric date: Mon Jun 07 16:34:17 2004 +0200 summary: Première relecture des fichiers README et associés. changeset: 106:d76a5467a2c6 user: lehyaric date: Mon Jun 07 16:34:17 2004 +0200 summary: Première relecture des fichiers README et associés. changeset: 105:b58a786980f6 user: lehyaric date: Mon Jun 07 16:34:17 2004 +0200 summary: Première relecture des fichiers README et associés. changeset: 104:83b96ae3f863 user: lehyaric date: Mon Jun 07 16:34:17 2004 +0200 summary: Première relecture des fichiers README et associés. 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 changeset: 44:3572cd801d80 user: hecht date: Fri Jun 04 15:22:02 2004 +0200 summary: *** empty log message *** changeset: 43:7baa4c3c41ef user: hecht date: Fri Jun 04 15:22:02 2004 +0200 summary: *** empty log message *** changeset: 42:68e784364499 user: hecht date: Wed May 26 22:22:36 2004 +0200 summary: *** empty log message *** changeset: 41:db5375fde77a user: hecht date: Wed May 26 22:00:26 2004 +0200 summary: *** empty log message *** changeset: 40:399fdf624955 user: hecht date: Wed May 26 21:58:43 2004 +0200 summary: *** empty log message *** 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 changeset: 38:4f307cbfc41a user: hecht date: Tue May 25 13:51:07 2004 +0200 summary: *** empty log message *** 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 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 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 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 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 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. 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 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 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. 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. changeset: 27:33eb5379f1b1 user: lehyaric date: Thu May 13 09:54:49 2004 +0200 summary: Ajout progressif de tous les fichiers à ignorer. changeset: 26:c5f6979dfddd user: hecht date: Wed May 12 21:32:42 2004 +0200 summary: *** empty log message *** changeset: 25:4bf5a81958af user: lehyaric date: Wed May 12 14:34:39 2004 +0200 summary: Fichier regénéré à la compilation changeset: 24:343d50721685 user: ly date: Wed May 12 13:21:45 2004 +0200 summary: *** empty log message *** changeset: 23:86eda52226a7 user: ly date: Wed May 12 13:21:44 2004 +0200 summary: *** empty log message *** changeset: 22:4aa14c3200dc user: hecht date: Wed May 12 12:10:56 2004 +0200 summary: *** empty log message *** changeset: 21:52c723e3b5d2 user: hecht date: Wed May 12 12:10:56 2004 +0200 summary: *** empty log message *** changeset: 20:df833d6233c6 user: hecht date: Wed May 12 12:10:56 2004 +0200 summary: *** empty log message *** changeset: 19:a4fb91c7bf52 user: hecht date: Wed May 12 12:06:10 2004 +0200 summary: *** empty log message *** changeset: 18:67575fb8c75b user: hecht date: Wed May 12 11:35:31 2004 +0200 summary: *** empty log message *** changeset: 17:416a46105dbb user: hecht date: Wed May 12 11:35:31 2004 +0200 summary: *** empty log message *** changeset: 16:857518acb793 user: hecht date: Wed May 12 11:35:31 2004 +0200 summary: *** empty log message *** changeset: 15:ab21c2321e56 user: hecht date: Wed May 12 11:35:31 2004 +0200 summary: *** empty log message *** changeset: 14:861633b13870 user: hecht date: Wed May 12 11:35:31 2004 +0200 summary: *** empty log message *** changeset: 13:e92228f45751 user: hecht date: Wed May 12 11:35:31 2004 +0200 summary: *** empty log message *** changeset: 12:e311b6dcae4a user: hecht date: Wed May 12 11:35:31 2004 +0200 summary: *** empty log message *** changeset: 11:7485d6e98966 user: hecht date: Wed May 12 11:35:31 2004 +0200 summary: *** empty log message *** changeset: 10:c54fd00d722d user: hecht date: Wed May 12 11:35:31 2004 +0200 summary: *** empty log message *** changeset: 9:aed0c05275f3 user: hecht date: Wed May 12 11:35:31 2004 +0200 summary: *** empty log message *** changeset: 8:e322689b6e92 user: hecht date: Wed May 12 11:35:31 2004 +0200 summary: *** empty log message *** changeset: 7:ef03e67b3e10 user: hecht date: Wed May 12 11:35:30 2004 +0200 summary: *** empty log message *** changeset: 6:d46f9d0308fb user: hecht date: Wed May 12 11:35:30 2004 +0200 summary: *** empty log message *** changeset: 5:cf149a2e8fec user: hecht date: Wed May 12 11:35:30 2004 +0200 summary: *** empty log message *** changeset: 4:f449141657dd user: hecht date: Wed May 12 11:35:30 2004 +0200 summary: *** empty log message *** changeset: 3:f22e3359ec26 user: ly date: Tue May 11 17:37:36 2004 +0200 summary: *** empty log message *** 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 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 changeset: 0:6d28b8993874 tag: FREEFEM_1_38 user: lehyaric date: Mon Apr 26 11:58:47 2004 +0200 summary: Initial revision freefem++-3.26-2/HISTORY_BEFORE_2005000644 000767 000767 00000054104 11406142255 015354 0ustar00hecht000000 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.26-2/INNOVATION000644 000767 000767 00000142407 12243175545 014223 0ustar00hecht000000 000000 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) 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 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 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 Mafile.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 elemnt 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 previoux 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 cleanning code . - correct bug in gestion off outsite flag is 3d in case of bute 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 elasitic 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 in eigen - correct typo poblem (string size) when a change the default window size in postscrip in version 3.19-1 to have more precise postscript plot version 3.19-1 - add tool to create Quadrature formlar 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 partionner 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 documention - 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 Elemeny 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 matric multy in lapck 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 parallele 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 choise 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 proble 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 og 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 seach in find ouside set global variable : searchMethod=1; // more safe seach algo (can be expensive in case of lot of ouside 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 permuation 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 bounary condition in 3D see examples++-3d/periodic-3d.edp - correct configure to scotch compilation on gnone (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 matix, 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 confugure 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 optimze 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 problom) 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 beetween 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 seach 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 (Hermissian stuff) in formal array with [ ]' in linear comb of complex matrix now A + (-1)*A' is zero is A is hermisian . 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 interpertation 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 genertion 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 documetation lot of mistake in examples++-load add tool to compile all examples add PICHON stuff for brute force seach 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 asset 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 (symptome 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 floag 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 mestis - correct display of 3d mesh (with light doday) - 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 optimisation 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 indice 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 inqure 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 contening the boundary elmt k Th.be(k).whoinElement ; // return the edge/face number of element contening 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 comunicator 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 isovalue 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 broadcasr 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 ordre 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 independant 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 Neuman 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 mesher (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 erreur 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 abscisse 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 intialized adj of edges on geometry (very old bug) in case of multi points. with vebosity=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 probleme in mpi recive 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 debain systeme - correct checking code in probleme 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 variationnal 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 examles++-load v 2.19 (august, 19 2007) - correct buildmesh from geometry file and add nbvx= named parameter to infore the maximal number of verter 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, syntaxe: a.sort, and we have : a[i-1] <= a[i] for i =0 to a.n-1 - add v=a.quantile(p) ; statisticial 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 theoriticaly 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,colunm 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 valeu 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 formular automatic choose with the qforder= field by default the order is correct until order 10 (so exact for P9 polynomals) 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 (pesonnal 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 optimisation 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 formular 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 pointeur 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 methode is boggus of the kind on meshes, i make an optimisation 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 floatting 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 elemnt 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 randow 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 openned 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 utilisation 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 separtor 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 variationnal form) before we alway use a quadrature formula of order 3, now we can change the quadrature formula and the defaut 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 vartionnal inequation. VI.edp * add possibility to build matrix where the 3 meshes the integrale mesh, unkwon FE mesh, test FE function can be different. You must use varf to build the matrix is not a standard porblem. * Improvement of dynamic loading facility under the 3 systems add a fast fourier transform with dynamic loading see examples++-load/dfft.edp freefem++-3.26-2/INSTALL000644 000767 000767 00000022030 11406142255 013622 0ustar00hecht000000 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.26-2/Install-MacOS.command.in000644 000767 000767 00000003055 11406142255 017112 0ustar00hecht000000 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.26-2/INSTALL-MacOSX000644 000767 000767 00000003065 11515302043 014713 0ustar00hecht000000 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.26-2/install-sh000755 000767 000767 00000031600 11406142256 014601 0ustar00hecht000000 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.26-2/logo.ico000644 000767 000767 00000006066 11406142256 014241 0ustar00hecht000000 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 AutoGeneratedFile.tar.gz:configure List_generate_file Makefile.in configure.ac tar cvfz $@ `cat List_generate_file` freefem++-3.26-2/Makefile.in000644 000767 000767 00000110431 12245613202 014636 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 = . DIST_COMMON = INSTALL NEWS README AUTHORS ChangeLog \ $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/configure $(am__configure_deps) \ $(srcdir)/config.h.in mkinstalldirs COPYING TODO compile \ config.guess config.sub depcomp install-sh missing ylwrap ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 \ 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 \ ./build/cleancrlf 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 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 .PRECIOUS: 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 @if test ! -f $@; then rm -f stamp-h1; else :; fi @if test ! -f $@; then $(MAKE) $(AM_MAKEFLAGS) stamp-h1; else :; fi 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= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ 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 tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z $(am__post_remove_distdir) dist-shar: distdir 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)/_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 \ && ../configure --srcdir=.. --prefix="$$dc_install_base" \ $(AM_DISTCHECK_CONFIGURE_FLAGS) \ $(DISTCHECK_CONFIGURE_FLAGS) \ && $(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 # 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 AutoGeneratedFile.tar.gz:configure List_generate_file Makefile.in configure.ac tar cvfz $@ `cat 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.26-2/missing000755 000767 000767 00000024032 11406142256 014175 0ustar00hecht000000 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.26-2/mkinstalldirs000755 000767 000767 00000003704 11406142256 015407 0ustar00hecht000000 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.26-2/mode-mi-edp.zip000644 000767 000767 00000047403 11406142256 015426 0ustar00hecht000000 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.26-2/NEWS000644 000767 000767 00000000000 11406142255 013261 0ustar00hecht000000 000000 freefem++-3.26-2/README000644 000767 000767 00000034511 12211622265 013457 0ustar00hecht000000 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 autorecong are not on the directly in distrubution. -- to rebuild with automake vzersion >= 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 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.26-2/README_ARPACK000644 000767 000767 00000001102 11406142255 014467 0ustar00hecht000000 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.26-2/README_MAC000644 000767 000767 00000007377 12241062513 014146 0ustar00hecht000000 000000 To compile a full version of FreeFem++ under MacOS --------------------------------------------------- Under Mavrisk (10.9) 2012 ( xcode 5.0.1 form scratch) ------------------------------------------------- remark: All line beginning by # are shell command in terminal. 1) install xcode 5.0.1 , 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=/usr/local/bin/gcc CXX=/usr/local/bin/g++ F77=/usr/local/bin/gfortran FC=/usr/local/bin/gfortran # 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=/usr/local/bin/gcc # make # sudo make install 7) install mecurial from the web http://mercurial.selenic.com 8) downlaad # hg clone http://www.freefem.org/ff++/ff++ 9) compilation of freefem++ # cd ff++ # ./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' 'CFLAGS=-mmacosx-version-min=10.8' 'CXXFLAGS=-mmacosx-version-min=10.8 -std=c++11' 'CXX=clang++ -isysroot /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk' '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 ------------ 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 gnuplotfreefem++-3.26-2/README_WINDOWS000644 000767 000767 00000011257 11654251014 014673 0ustar00hecht000000 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.26-2/reconfigure000755 000767 000767 00000000311 11406142256 015026 0ustar00hecht000000 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.26-2/regtests.m4000644 000767 000767 00000002674 11406142256 014710 0ustar00hecht000000 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.26-2/src/000755 000767 000767 00000000000 12245613625 013371 5ustar00hecht000000 000000 freefem++-3.26-2/test-driver000755 000767 000767 00000007611 12070751235 015001 0ustar00hecht000000 000000 #! /bin/sh # test-driver - basic testsuite driver script. scriptversion=2012-06-27.10; # 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.26-2/test-driver-ff000755 000767 000767 00000010104 12163103142 015350 0ustar00hecht000000 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.26-2/TODO000644 000767 000767 00000001201 11500221242 013243 0ustar00hecht000000 000000 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.26-2/WHERE_LIBRARY-mkl000644 000767 000767 00000000645 11475255160 015351 0ustar00hecht000000 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.26-2/WindowsPackage.m4000644 000767 000767 00000015260 12167254041 015752 0ustar00hecht000000 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\*.cpp"; DestDir: "{app}\examples++-load" Source: "examples++-load\*.pgm"; 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}\FreeFem++.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.26-2/ylwrap000755 000767 000767 00000007644 11406142256 014054 0ustar00hecht000000 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.26-2/src/Algo/000755 000767 000767 00000000000 12245613625 014253 5ustar00hecht000000 000000 freefem++-3.26-2/src/bamg/000755 000767 000767 00000000000 12245613625 014277 5ustar00hecht000000 000000 freefem++-3.26-2/src/bamglib/000755 000767 000767 00000000000 12245613624 014765 5ustar00hecht000000 000000 freefem++-3.26-2/src/bin-win32/000755 000767 000767 00000000000 12245613625 015101 5ustar00hecht000000 000000 freefem++-3.26-2/src/Carbon.r000755 000767 000767 00000000541 11406142256 014756 0ustar00hecht000000 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.26-2/src/depcomp000755 000767 000767 00000033052 11406142256 014744 0ustar00hecht000000 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.26-2/src/Eigen/000755 000767 000767 00000000000 12245613625 014420 5ustar00hecht000000 000000 freefem++-3.26-2/src/femlib/000755 000767 000767 00000000000 12245613624 014626 5ustar00hecht000000 000000 freefem++-3.26-2/src/fflib/000755 000767 000767 00000000000 12245613625 014453 5ustar00hecht000000 000000 freefem++-3.26-2/src/FreeFem++-CoCoa000755 000767 000767 00000001655 11406142256 015742 0ustar00hecht000000 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.26-2/src/Graphics/000755 000767 000767 00000000000 12245613625 015131 5ustar00hecht000000 000000 freefem++-3.26-2/src/lglib/000755 000767 000767 00000000000 12245613625 014462 5ustar00hecht000000 000000 freefem++-3.26-2/src/libMesh/000755 000767 000767 00000000000 12245613624 014753 5ustar00hecht000000 000000 freefem++-3.26-2/src/Makefile.am000644 000767 000767 00000001321 12140717645 015423 0ustar00hecht000000 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.26-2/src/Makefile.in000644 000767 000767 00000052750 12245613204 015440 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 .PRECIOUS: 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= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ 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 # 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.26-2/src/medit/000755 000767 000767 00000000000 12245613625 014473 5ustar00hecht000000 000000 freefem++-3.26-2/src/mpi/000755 000767 000767 00000000000 12245613625 014156 5ustar00hecht000000 000000 freefem++-3.26-2/src/nw/000755 000767 000767 00000000000 12245613625 014015 5ustar00hecht000000 000000 freefem++-3.26-2/src/solver/000755 000767 000767 00000000000 12245613624 014702 5ustar00hecht000000 000000 freefem++-3.26-2/src/solver/complex_pastix_FreeFem.cpp000644 000767 000767 00000052121 11406226636 022040 0ustar00hecht000000 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.26-2/src/solver/complex_SuperLU_DIST_FreeFem.cpp000644 000767 000767 00000056760 11406226636 022727 0ustar00hecht000000 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.26-2/src/solver/ffsuperludistoption.hpp000644 000767 000767 00000042511 11406226636 021547 0ustar00hecht000000 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.26-2/src/solver/hips_FreeFem.cpp000755 000767 000767 00000046025 11406226636 017755 0ustar00hecht000000 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.26-2/src/solver/hypre_FreeFem.cpp000755 000767 000767 00000160444 12167254041 020137 0ustar00hecht000000 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.26-2/src/solver/makefile000644 000767 000767 00000007235 11406142256 016405 0ustar00hecht000000 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.26-2/src/solver/makefile-common.inc000644 000767 000767 00000003540 11641125340 020432 0ustar00hecht000000 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.26-2/src/solver/makefile-sparsesolver.inc000644 000767 000767 00000025673 11641125340 021705 0ustar00hecht000000 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.26-2/src/solver/MUMPS_FreeFem.cpp000644 000767 000767 00000207446 11406226636 017716 0ustar00hecht000000 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.26-2/src/solver/parms_FreeFem.cpp000755 000767 000767 00000101470 12167254041 020124 0ustar00hecht000000 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.26-2/src/solver/README_COMPILE000644 000767 000767 00000025161 11406142256 016733 0ustar00hecht000000 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.26-2/src/solver/real_pastix_FreeFem.cpp000644 000767 000767 00000052111 11406226636 021313 0ustar00hecht000000 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.26-2/src/solver/real_SuperLU_DIST_FreeFem.cpp000644 000767 000767 00000054642 11406226636 022200 0ustar00hecht000000 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.26-2/src/solver/wrapper_dotblas.c000644 000767 000767 00000001625 11406142256 020236 0ustar00hecht000000 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.26-2/src/solver/wrapper_dotblas.f000644 000767 000767 00000002423 11406142256 020236 0ustar00hecht000000 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.26-2/src/solver/wrapper_dotblas1.c000644 000767 000767 00000006470 11406142256 020322 0ustar00hecht000000 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.26-2/src/solver/wrapper_dotblas1.f000644 000767 000767 00000002343 11406142256 020320 0ustar00hecht000000 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.26-2/src/nw/Makefile.am000644 000767 000767 00000002242 12167254041 016045 0ustar00hecht000000 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.26-2/src/nw/Makefile.in000644 000767 000767 00000142722 12245613204 016063 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 .PRECIOUS: 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 # 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.26-2/src/mpi/ff-mpirun.in000755 000767 000767 00000001526 12245571317 016421 0ustar00hecht000000 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 ffmpi="$dir/$ffmpi"; 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.26-2/src/mpi/Makefile.am000644 000767 000767 00000002025 12167254041 016205 0ustar00hecht000000 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.26-2/src/mpi/Makefile.in000644 000767 000767 00000077601 12245613204 016227 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 .PRECIOUS: 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 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.26-2/src/mpi/parallelempi-empty.cpp000644 000767 000767 00000000452 11500777105 020463 0ustar00hecht000000 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.26-2/src/mpi/parallelempi.cpp000644 000767 000767 00000262354 12167254041 017341 0ustar00hecht000000 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" #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_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; } 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_)); } 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 ; } // 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.26-2/src/medit/animat.c000644 000767 000767 00000013552 11406142256 016111 0ustar00hecht000000 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.26-2/src/medit/bbfile.c000644 000767 000767 00000013746 11406142256 016070 0ustar00hecht000000 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.26-2/src/medit/camera.c000644 000767 000767 00000006532 11406142256 016070 0ustar00hecht000000 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.26-2/src/medit/cenrad.c000644 000767 000767 00000004122 11406142256 016065 0ustar00hecht000000 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.26-2/src/medit/chrono.h000644 000767 000767 00000000713 11406142256 016130 0ustar00hecht000000 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.26-2/src/medit/clip.c000644 000767 000767 00000022175 11406142256 015570 0ustar00hecht000000 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.26-2/src/medit/clipvol.c000644 000767 000767 00000035410 11406142256 016305 0ustar00hecht000000 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.26-2/src/medit/critip.c000644 000767 000767 00000017476 11406142256 016143 0ustar00hecht000000 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.26-2/src/medit/cube.c000644 000767 000767 00000006127 11406142256 015556 0ustar00hecht000000 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.26-2/src/medit/dlists.c000644 000767 000767 00000047165 11406142256 016151 0ustar00hecht000000 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.26-2/src/medit/eigenv.h000644 000767 000767 00000000173 11406142256 016115 0ustar00hecht000000 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.26-2/src/medit/ellipse.c000644 000767 000767 00000021140 12021372061 016256 0ustar00hecht000000 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.26-2/src/medit/extern.h000644 000767 000767 00000000273 11406142256 016146 0ustar00hecht000000 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.26-2/src/medit/geometry.c000644 000767 000767 00000005737 11406142256 016501 0ustar00hecht000000 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.26-2/src/medit/gisfil.c000644 000767 000767 00000010633 11406142256 016112 0ustar00hecht000000 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.26-2/src/medit/grafic.h000644 000767 000767 00000012173 11406142256 016076 0ustar00hecht000000 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.26-2/src/medit/hash.c000644 000767 000767 00000020546 11406142256 015564 0ustar00hecht000000 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.26-2/src/medit/ilists.c000644 000767 000767 00000036436 11406142256 016155 0ustar00hecht000000 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.26-2/src/medit/image.c000644 000767 000767 00000017361 11406142256 015724 0ustar00hecht000000 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.26-2/src/medit/image.h000644 000767 000767 00000001067 11406142256 015725 0ustar00hecht000000 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.26-2/src/medit/inmsh2.c000644 000767 000767 00000011445 11406142256 016037 0ustar00hecht000000 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.26-2/src/medit/inout.c000755 000767 000767 00000050531 11406142256 015777 0ustar00hecht000000 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.26-2/src/medit/inout_morice.c000755 000767 000767 00000106730 11500006113 017322 0ustar00hecht000000 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.26-2/src/medit/inout_popenbinaire.c000644 000767 000767 00000063252 11500003456 020524 0ustar00hecht000000 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.26-2/src/medit/items.c000644 000767 000767 00000030153 11406142256 015755 0ustar00hecht000000 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.26-2/src/medit/keyboard.c000644 000767 000767 00000051711 11406142256 016437 0ustar00hecht000000 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); 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 '!': /* 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.26-2/src/medit/listnum.c000644 000767 000767 00000006216 11406142256 016332 0ustar00hecht000000 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.26-2/src/medit/Makefile.am000644 000767 000767 00000003065 12214307167 016530 0ustar00hecht000000 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.26-2/src/medit/Makefile.in000644 000767 000767 00000064542 12245613204 016544 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 .PRECIOUS: 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 $< .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 `$(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 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.26-2/src/medit/material.c000644 000767 000767 00000033500 11406142256 016431 0ustar00hecht000000 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.26-2/src/medit/medit.c000644 000767 000767 00000024562 11500004024 015726 0ustar00hecht000000 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.26-2/src/medit/medit.h000644 000767 000767 00000003513 11406142256 015743 0ustar00hecht000000 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.26-2/src/medit/menus.c000644 000767 000767 00000074704 11406142256 015775 0ustar00hecht000000 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.26-2/src/medit/mesh.c000644 000767 000767 00000032146 11406142256 015574 0ustar00hecht000000 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.26-2/src/medit/mesh.h000644 000767 000767 00000003621 11406142256 015575 0ustar00hecht000000 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.26-2/src/medit/mlists.c000644 000767 000767 00000112065 11406142256 016152 0ustar00hecht000000 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.26-2/src/medit/morphing.c000644 000767 000767 00000003412 11406142256 016455 0ustar00hecht000000 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.26-2/src/medit/mouse.c000644 000767 000767 00000023764 11406142256 015776 0ustar00hecht000000 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.26-2/src/medit/normal.c000644 000767 000767 00000006617 11406142256 016134 0ustar00hecht000000 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.26-2/src/medit/param.c000644 000767 000767 00000002125 11406142256 015732 0ustar00hecht000000 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.26-2/src/medit/parsar.c000644 000767 000767 00000010440 11500004245 016107 0ustar00hecht000000 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.26-2/src/medit/parsop.c000644 000767 000767 00000024737 11406142256 016153 0ustar00hecht000000 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.26-2/src/medit/particle.c000644 000767 000767 00000021603 11406142256 016437 0ustar00hecht000000 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.26-2/src/medit/path.c000644 000767 000767 00000010304 11406142256 015564 0ustar00hecht000000 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.26-2/src/medit/persp.c000644 000767 000767 00000003570 11406142256 015770 0ustar00hecht000000 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.26-2/src/medit/picking.c000644 000767 000767 00000063207 11500001056 016251 0ustar00hecht000000 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.26-2/src/medit/psfile.c000644 000767 000767 00000015014 11406142256 016115 0ustar00hecht000000 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.26-2/src/medit/scene.c000644 000767 000767 00000056450 11406142256 015741 0ustar00hecht000000 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.26-2/src/medit/scissor.c000644 000767 000767 00000005372 11406142256 016326 0ustar00hecht000000 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.26-2/src/medit/sftcpy.c000644 000767 000767 00000016700 11406142256 016146 0ustar00hecht000000 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.26-2/src/medit/sproto.h000644 000767 000767 00000021060 11406142256 016164 0ustar00hecht000000 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 ); /* 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.26-2/src/medit/status.c000644 000767 000767 00000011144 11406142256 016156 0ustar00hecht000000 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.26-2/src/medit/stream.c000644 000767 000767 00000135370 11406142256 016136 0ustar00hecht000000 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.26-2/src/medit/tiles.c000644 000767 000767 00000016046 11406142256 015761 0ustar00hecht000000 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.26-2/src/medit/util.c000644 000767 000767 00000016013 11406142256 015610 0ustar00hecht000000 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.26-2/src/medit/vector.c000644 000767 000767 00000050312 11406142256 016135 0ustar00hecht000000 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.26-2/src/medit/view.c000644 000767 000767 00000004463 11406142256 015613 0ustar00hecht000000 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.26-2/src/medit/zaldy1.c000644 000767 000767 00000003373 11406142256 016044 0ustar00hecht000000 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.26-2/src/medit/zaldy2.c000644 000767 000767 00000001062 11406142256 016036 0ustar00hecht000000 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.26-2/src/libMesh/chrono.c000644 000767 000767 00000003257 11406142256 016412 0ustar00hecht000000 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.26-2/src/libMesh/eigenv.c000644 000767 000767 00000035712 11406142256 016400 0ustar00hecht000000 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.26-2/src/libMesh/eigenv.h000644 000767 000767 00000000300 11436737460 016400 0ustar00hecht000000 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.26-2/src/libMesh/libmesh3.c000644 000767 000767 00000056167 11406142256 016640 0ustar00hecht000000 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.26-2/src/libMesh/libmesh3.h000644 000767 000767 00000010026 11406142256 016625 0ustar00hecht000000 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.26-2/src/libMesh/libmesh5.c000644 000767 000767 00000064502 11406142256 016632 0ustar00hecht000000 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/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 .PRECIOUS: 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 $< .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 `$(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 # 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.26-2/src/libMesh/memory.c000644 000767 000767 00000014233 11406142256 016426 0ustar00hecht000000 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.26-2/src/libMesh/memory.h000644 000767 000767 00000000625 11406142256 016433 0ustar00hecht000000 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.26-2/src/lglib/lg.tab.cpp000644 000767 000767 00000344264 12235141620 016340 0ustar00hecht000000 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" #define eflval yylval #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 "AFunction.hpp" // to reserve space to graphical pointer function #include "rgraph.hpp" #include "RNM.hpp" #include "fem.hpp" #include "FESpacen.hpp" #include "FESpace.hpp" #include "MeshPoint.hpp" #include "lgfem.hpp" #include "lex.hpp" #include "environment.hpp" 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 *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 &); 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; /* 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 126 "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 346 "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 359 "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 190 /* YYNRULES -- Number of states. */ #define YYNSTATES 415 /* 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, 448, 450, 454, 456, 458, 460, 462, 464, 466, 470, 474, 478, 482, 486, 490, 494, 496, 502, 506, 512, 514, 518, 522, 526, 530, 534, 538, 542, 546, 550, 554, 558, 562, 566, 570, 574, 578, 582, 586, 590, 592, 594, 598, 604, 605, 607, 609, 611, 615, 617, 621, 625, 629, 633, 639, 641, 645, 647, 650, 652, 656, 660, 663, 665, 667, 669, 671, 673, 678, 683, 690, 694, 698, 702, 707, 711, 716, 720, 725, 728, 731, 736, 740 }; /* 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, 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, 259, 259, 303, 306, 307, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 333, 334, 337, 337, 337, 337, 341, 342, 343, 345, 352, 353, 354, 355, 356, 357, 358, 363, 364, 365, 366, 367, 368, 369, 370, 378, 379, 380, 381, 382, 383, 386, 387, 393, 393, 393, 394, 395, 400, 401, 403, 404, 406, 407, 413, 416, 417, 422, 422, 423, 424, 425, 427, 426, 443, 442, 451, 452, 454, 456, 461, 461, 464, 468, 469, 470, 471, 472, 473, 474, 475, 479, 480, 481, 482, 484, 486, 489, 493, 497, 504, 507, 516, 522, 523, 528, 529, 530, 531, 532, 536, 537, 538, 539, 540, 541, 542, 543, 548, 549, 550, 551, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 579, 580, 581, 582, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 599, 600, 604, 605, 608, 609, 610, 611, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 642, 643 }; #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, 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, 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, 111, 110, 112, 114, 113, 0, 0, 171, 172, 173, 170, 0, 174, 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, 108, 115, 123, 127, 164, 166, 0, 0, 0, 0, 0, 0, 162, 0, 0, 70, 0, 89, 90, 102, 103, 0, 0, 0, 0, 0, 42, 0, 151, 0, 151, 0, 151, 0, 0, 1, 2, 5, 0, 0, 0, 50, 65, 67, 75, 0, 0, 0, 0, 0, 92, 165, 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, 187, 186, 0, 169, 0, 151, 0, 0, 0, 189, 0, 190, 0, 0, 74, 104, 0, 0, 0, 0, 6, 0, 170, 152, 153, 154, 148, 0, 147, 156, 0, 180, 0, 182, 0, 184, 0, 0, 0, 100, 31, 0, 0, 27, 0, 28, 30, 29, 0, 25, 0, 0, 0, 82, 99, 85, 0, 0, 0, 0, 109, 116, 117, 118, 119, 120, 121, 122, 136, 135, 139, 140, 137, 138, 146, 145, 141, 143, 144, 142, 133, 134, 128, 131, 132, 130, 129, 0, 125, 167, 168, 0, 178, 0, 179, 0, 163, 170, 0, 0, 0, 0, 35, 71, 47, 188, 0, 43, 0, 6, 28, 29, 0, 7, 0, 6, 0, 0, 0, 181, 183, 185, 0, 0, 107, 0, 0, 0, 73, 62, 0, 0, 53, 52, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 175, 0, 176, 97, 0, 36, 37, 38, 0, 69, 0, 0, 0, 76, 0, 0, 9, 0, 11, 0, 79, 0, 0, 13, 0, 155, 149, 157, 158, 159, 0, 160, 0, 0, 32, 0, 34, 0, 0, 63, 68, 26, 0, 0, 51, 86, 0, 0, 96, 0, 91, 124, 126, 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, 177, 98, 0, 0, 48, 0, 44, 0, 0, 19, 0, 21, 0, 0, 23, 0, 0, 150, 161, 0, 0, 0, 64, 54, 0, 0, 0, 41, 0, 0, 17, 20, 22, 18, 24, 0, 0, 109, 0, 56, 0, 0, 0, 49, 46, 80, 0, 106, 0, 95, 94, 0, 78, 57, 0, 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, 81, -230, 1, 90, -230, -230, 97, 132, 222, -230, 212, 150, 21, 110, 201, 99, -230, -230, 182, 166, 576, -230, 199, 24, 156, -230, 576, 204, 221, 184, -230, 2, 945, -230, 39, 15, -230, -230, 791, 222, 231, 21, 110, 201, 112, -230, 5, 232, -230, 3, -230, -230, -230, -230, 4, 217, 222, 218, 114, 209, 236, 732, 254, 732, 260, 732, 261, 206, -230, -230, -230, 263, 249, 7, 38, -230, 303, -230, 355, 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, 268, 119, -230, 222, -230, 900, 81, -230, -230, 297, 129, 46, 222, 251, 281, 311, 14, 36, 151, -230, 312, 423, -230, 154, -230, 169, -230, 170, -230, 277, 222, 576, -230, 198, 6, 332, -230, 282, -230, -230, -230, 48, -230, 222, 222, 136, -230, -230, -230, 280, 8, 172, 454, -230, -230, -230, -230, -230, -230, -230, -230, 1017, 1017, 1032, 1032, 447, 447, 762, 762, 339, 339, 339, 339, 320, 320, -230, -230, -230, -230, -230, 643, 662, -230, -230, 174, -230, 89, -230, 576, -230, 344, 243, 253, 264, 176, -230, -230, 319, -230, 298, 334, 9, 251, 51, 68, 179, 349, 77, 251, 222, 222, 776, -230, -230, -230, 364, 104, -230, 222, 900, 263, -230, -230, 188, 192, 126, -230, 336, 192, -230, 263, 222, 222, 576, 321, 222, 222, -230, 820, -230, 374, 222, -230, -230, -230, 936, -230, 323, 341, 327, -230, 109, 192, -230, 192, -230, 676, -230, 222, 192, -230, 181, -230, 681, 14, 36, 151, 380, -230, 222, 314, -230, 185, -230, 192, 354, -230, 386, -230, 222, 222, -230, 387, 10, 12, -230, 359, -230, 1000, 1000, 361, 576, -230, 21, 110, 201, 395, -230, 113, 369, 373, -230, -230, -230, 251, 103, 138, 406, 141, 412, -230, -230, -230, 222, 222, 414, -230, -230, 116, 222, 188, -230, 382, 222, 222, 385, -230, -230, 222, 365, -230, 366, -230, 117, 192, -230, 192, -230, 222, 192, -230, 222, 348, 1000, -230, 222, 392, 390, -230, -230, 189, 190, 415, -230, 416, 417, -230, -230, -230, -230, -230, 377, 576, 419, 222, -230, 576, 576, 422, -230, -230, -230, 516, -230, 439, -230, -230, 440, -230, -230, 576, -230 }; /* YYPGOTO[NTERM-NUM]. */ static const yytype_int16 yypgoto[] = { -230, -230, -230, -38, -229, 145, -68, -201, 226, -21, 275, 127, -230, -230, -230, -230, -230, 340, -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, 441, -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, 136, 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, 137, 176, 98, 63, 134, 74, 169, 75, 232, 306, 257, 52, 74, 185, 75, 83, 86, 259, 260, 315, 285, 143, 170, 87, 171, 172, 173, 76, 181, 77, 177, 217, 96, 140, 141, 239, 254, 287, 265, 283, 356, 233, 357, 258, 183, 184, 292, 186, 124, 125, 169, 271, 187, 188, 189, 190, 191, 192, 193, 99, 100, 101, 102, 103, 104, 366, 136, 169, 171, 172, 173, 289, 367, 301, 95, 362, 169, 145, 257, 289, 60, 95, 240, 295, 272, 171, 172, 173, 250, 312, 222, 95, 64, 228, 171, 172, 173, 234, 80, 303, 323, 76, 169, 77, 334, 146, 135, 369, 363, 83, 372, 379, 389, 221, -29, 325, 244, 58, 313, 330, 171, 172, 173, 231, 239, 286, 288, 65, 261, 293, 239, 244, 244, 300, 95, 87, 244, 169, 278, 81, 169, 289, 78, 289, 79, 273, 311, 278, 245, 71, 175, 95, 95, 354, 355, 171, 172, 173, 171, 172, 173, 251, 66, 246, 247, 72, 266, 329, 270, 82, 279, 240, 85, 290, 335, 345, 336, 240, 340, 350, 307, 344, 68, 399, 400, 68, 90, 308, 377, 252, 318, 169, 78, 380, 79, 92, 175, 162, 163, 2, 3, 70, 386, 69, 70, 304, 4, 5, 6, 171, 172, 173, 93, 7, 8, 94, 316, 317, 9, 10, 11, 12, 69, 138, 14, 341, 239, 368, 370, 215, 373, 216, 142, 144, 74, 147, 75, 53, 407, 54, 55, 56, 275, 235, 76, 343, 77, 154, 360, 154, 169, 154, 276, 157, 348, 78, 390, 79, 391, 159, 161, 393, 166, 277, 168, 178, 72, 220, 236, 172, 237, 230, 241, 240, -27, 242, 248, 256, 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, 255, 274, 383, 384, 264, 280, 291, 281, 405, 1, 117, 118, 119, 120, 121, 122, 123, 408, 409, 392, 282, 302, 394, 83, 396, 314, 2, 3, 319, 324, 332, 414, 331, 4, 5, 6, 333, 347, 349, 352, 7, 8, 353, 253, 358, 9, 10, 11, 12, 13, 359, 14, 361, 15, 16, 364, 17, 18, 19, 20, 21, 22, 365, 371, 23, 24, 25, 26, 27, 374, 378, 382, 385, 395, 387, 388, 28, 397, 398, 29, 30, 179, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 404, 401, 351, 262, 402, 403, 406, 1, 410, 296, 154, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 2, 3, 412, 413, 305, 229, 381, 4, 5, 6, 321, 322, 97, 154, 7, 8, 0, 249, 0, 9, 10, 11, 12, 13, 0, 14, 243, 15, 16, 0, 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, 411, 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, 5, 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, 38, 6, 6, 45, 52, 34, 42, 36, 5, 253, 5, 34, 34, 94, 36, 91, 35, 176, 177, 263, 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, 42, 5, 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, 37, 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, 73, 37, 37, 58, 37, 278, 37, 46, 37, 235, 16, 37, 285, 37, 287, 241, 289, 37, 35, 292, 16, 37, 37, 16, 73, 42, 347, 34, 266, 42, 34, 352, 36, 34, 307, 34, 35, 20, 21, 35, 361, 34, 35, 251, 27, 28, 29, 60, 61, 62, 34, 34, 35, 74, 264, 265, 39, 40, 41, 42, 34, 34, 45, 289, 337, 338, 339, 128, 341, 130, 58, 58, 34, 42, 36, 58, 397, 60, 61, 62, 42, 35, 34, 291, 36, 74, 324, 76, 42, 78, 42, 42, 302, 34, 367, 36, 369, 42, 42, 372, 42, 42, 58, 5, 58, 42, 60, 61, 62, 17, 34, 337, 6, 6, 42, 38, 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, 17, 6, 356, 357, 73, 35, 6, 58, 395, 3, 20, 21, 22, 23, 24, 25, 26, 399, 400, 371, 35, 6, 374, 405, 378, 38, 20, 21, 56, 4, 38, 413, 58, 27, 28, 29, 58, 6, 73, 34, 34, 35, 5, 5, 34, 39, 40, 41, 42, 43, 38, 45, 6, 47, 48, 35, 50, 51, 52, 53, 54, 55, 38, 6, 58, 59, 60, 61, 62, 6, 5, 38, 36, 74, 58, 58, 70, 34, 37, 73, 74, 75, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 73, 36, 307, 178, 38, 38, 37, 3, 36, 243, 244, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 20, 21, 37, 37, 252, 139, 353, 27, 28, 29, 268, 269, 45, 271, 34, 35, -1, 163, -1, 39, 40, 41, 42, 43, -1, 45, 77, 47, 48, -1, 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, 115, 108, 108, 36, 75, 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 259 "lg.ypp" { 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 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; NbPtr = ShowAlloc("end execution -- ",lg1) - NbPtr; if (NbPtr) { cout << " ######## We forget of deleting " << NbPtr << " Nb pointer, " << lg1-lg0 << "Bytes " << " , mpirank " << mpirank <push_back(UnId((yyvsp[(1) - (1)].str)));} break; case 8: #line 314 "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 315 "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 316 "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 317 "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 318 "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 319 "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 320 "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 321 "lg.ypp" { (yyval.clist_id) = new ListOfId(); (yyval.clist_id)->push_back(UnId((yyvsp[(2) - (3)].clist_id))) ;} break; case 16: #line 322 "lg.ypp" { (yyval.clist_id) = (yyvsp[(1) - (3)].clist_id); (yyval.clist_id)->push_back(UnId((yyvsp[(3) - (3)].str))) ;} break; case 17: #line 323 "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 324 "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 325 "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 326 "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 327 "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 328 "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 329 "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 330 "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 333 "lg.ypp" { (yyval.clist_id) = new ListOfId(); (yyval.clist_id)->push_back(UnId((yyvsp[(1) - (1)].str))); ;} break; case 26: #line 334 "lg.ypp" { (yyval.clist_id)=(yyvsp[(1) - (3)].clist_id) ; (yyval.clist_id)->push_back(UnId((yyvsp[(3) - (3)].str))); ;} break; case 31: #line 341 "lg.ypp" {(yyval.cexp)=currentblock->NewVar((yyvsp[(1) - (1)].str),dcltype);} break; case 32: #line 342 "lg.ypp" {(yyval.cexp)=currentblock->NewVar((yyvsp[(1) - (3)].str),dcltype,(yyvsp[(3) - (3)].cexp));} break; case 33: #line 343 "lg.ypp" {(yyval.cexp)=currentblock->NewVar((yyvsp[(1) - (4)].str),dcltype,(yyvsp[(3) - (4)].args)); (yyvsp[(3) - (4)].args).destroy();} break; case 34: #line 345 "lg.ypp" {(yyval.cexp)=C_F0((yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 35: #line 352 "lg.ypp" {(yyval.args)=(yyvsp[(1) - (1)].cexp);} break; case 36: #line 353 "lg.ypp" {(yyval.args)=Find((yyvsp[(1) - (2)].str));} break; case 37: #line 354 "lg.ypp" {(yyval.args)=Find((yyvsp[(1) - (2)].str));} break; case 38: #line 355 "lg.ypp" {(yyval.args)=Find((yyvsp[(1) - (2)].str));} break; case 39: #line 356 "lg.ypp" { (yyval.args)=make_pair((yyvsp[(1) - (3)].str),(yyvsp[(3) - (3)].cexp));} break; case 40: #line 357 "lg.ypp" { (yyval.args) = ((yyvsp[(1) - (3)].args) += (yyvsp[(3) - (3)].cexp)) ;} break; case 41: #line 358 "lg.ypp" { (yyval.args)= ((yyvsp[(1) - (5)].args)+= make_pair((yyvsp[(3) - (5)].str),(yyvsp[(5) - (5)].cexp)));} break; case 43: #line 364 "lg.ypp" {(yyval.type)=TypeArray((yyvsp[(1) - (4)].type),(yyvsp[(3) - (4)].type));} break; case 44: #line 365 "lg.ypp" {(yyval.type)=TypeArray(TypeArray((yyvsp[(1) - (7)].type),(yyvsp[(3) - (7)].type)),(yyvsp[(6) - (7)].type));} break; case 45: #line 366 "lg.ypp" {(yyval.type)=TypeArray((yyvsp[(1) - (6)].type),(yyvsp[(3) - (6)].type),(yyvsp[(5) - (6)].type));} break; case 46: #line 367 "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 368 "lg.ypp" {(yyval.type)=TypeTemplate((yyvsp[(1) - (4)].type),(yyvsp[(3) - (4)].type));} break; case 48: #line 369 "lg.ypp" {(yyval.type)=TypeArray(TypeTemplate((yyvsp[(1) - (7)].type),(yyvsp[(3) - (7)].type)),(yyvsp[(6) - (7)].type));} break; case 49: #line 370 "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 378 "lg.ypp" { (yyval.cexp) = NewFEvariable((yyvsp[(1) - (1)].str),currentblock,fespacetype,fespacecomplex,fespacedim); ;} break; case 51: #line 379 "lg.ypp" { (yyval.cexp) = NewFEarray((yyvsp[(1) - (4)].str),currentblock,fespacetype,(yyvsp[(3) - (4)].cexp),fespacecomplex,fespacedim); ;} break; case 52: #line 380 "lg.ypp" { (yyval.cexp) = NewFEvariable((yyvsp[(1) - (3)].str),currentblock,fespacetype,(yyvsp[(3) - (3)].cexp),fespacecomplex,fespacedim) ;} break; case 53: #line 381 "lg.ypp" { (yyval.cexp) = NewFEvariable((yyvsp[(2) - (3)].clist_id),currentblock,fespacetype,fespacecomplex,fespacedim) ;} break; case 54: #line 382 "lg.ypp" { (yyval.cexp) = NewFEarray((yyvsp[(2) - (6)].clist_id),currentblock,fespacetype,(yyvsp[(5) - (6)].cexp),fespacecomplex,fespacedim) ;} break; case 55: #line 383 "lg.ypp" { (yyval.cexp) = NewFEvariable((yyvsp[(2) - (5)].clist_id),currentblock,fespacetype,(yyvsp[(5) - (5)].cexp),fespacecomplex,fespacedim) ;} break; case 56: #line 386 "lg.ypp" { (yyval.cexp) = NewFEarray((yyvsp[(1) - (4)].str),currentblock,fespacetype,(yyvsp[(3) - (4)].cexp),fespacecomplex,fespacedim); ;} break; case 57: #line 387 "lg.ypp" { (yyval.cexp) = NewFEarray((yyvsp[(2) - (6)].clist_id),currentblock,fespacetype,(yyvsp[(5) - (6)].cexp),fespacecomplex,fespacedim) ;} break; case 58: #line 393 "lg.ypp" { fespacedim=2;} break; case 59: #line 393 "lg.ypp" { fespacedim=1;} break; case 60: #line 393 "lg.ypp" { fespacedim=3;} break; case 61: #line 394 "lg.ypp" {fespacecomplex=false; fespacetype = Find((yyvsp[(1) - (1)].str));;} break; case 62: #line 395 "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 400 "lg.ypp" { (yyval.cexp) = (yyvsp[(1) - (1)].cexp) ;} break; case 64: #line 401 "lg.ypp" { (yyval.cexp)=C_F0((yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));;} break; case 65: #line 403 "lg.ypp" { (yyval.cexp) = (yyvsp[(1) - (1)].cexp) ;} break; case 66: #line 404 "lg.ypp" { (yyval.cexp)=C_F0((yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));;} break; case 67: #line 406 "lg.ypp" { (yyval.cexp)=0; (yyval.cexp) = (yyvsp[(2) - (2)].cexp);} break; case 68: #line 407 "lg.ypp" { (yyval.cexp)=0; (yyval.cexp) = (yyvsp[(5) - (5)].cexp);} break; case 69: #line 413 "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 417 "lg.ypp" {(yyval.cexp)=C_F0((yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 72: #line 422 "lg.ypp" {dcltype=(yyvsp[(1) - (1)].type);} break; case 73: #line 422 "lg.ypp" {(yyval.cexp)=(yyvsp[(3) - (4)].cexp);} break; case 74: #line 423 "lg.ypp" {(yyval.cexp)=(yyvsp[(2) - (3)].cexp);} break; case 75: #line 424 "lg.ypp" { (yyval.cexp)=(yyvsp[(1) - (2)].cexp);} break; case 76: #line 425 "lg.ypp" {(yyval.cexp)=currentblock->NewID((yyvsp[(1) - (5)].type),(yyvsp[(2) - (5)].str),(yyvsp[(4) - (5)].cexp));;} break; case 77: #line 427 "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 436 "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 443 "lg.ypp" {Block::open(currentblock); (yyvsp[(1) - (5)].type)->SetArgs((yyvsp[(4) - (5)].clist_id));;} break; case 80: #line 445 "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 451 "lg.ypp" { Block::open(currentblock);} break; case 82: #line 452 "lg.ypp" { (yyval.cexp)=currentblock->close(currentblock);} break; case 83: #line 454 "lg.ypp" {ffassert(inloopcountinput((yyvsp[(2) - (2)].str));(yyval.cexp)= 0; ;} break; case 90: #line 470 "lg.ypp" {load((yyvsp[(2) - (2)].str));(yyval.cexp)= 0; ;} break; case 91: #line 471 "lg.ypp" {(yyval.cexp)=Try((yyvsp[(3) - (5)].cinst),(yyvsp[(5) - (5)].cexp),currentblock->close(currentblock));;} break; case 92: #line 472 "lg.ypp" {(yyval.cexp)=(yyvsp[(1) - (2)].cexp);} break; case 93: #line 473 "lg.ypp" {(yyval.cexp)=(yyvsp[(1) - (1)].cexp);} break; case 94: #line 474 "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 476 "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 479 "lg.ypp" {inloopcount--;(yyval.cexp)=While((yyvsp[(3) - (5)].cexp),(yyvsp[(5) - (5)].cexp));} break; case 97: #line 480 "lg.ypp" {(yyval.cexp)=FIf((yyvsp[(3) - (5)].cexp),(yyvsp[(5) - (5)].cexp));} break; case 98: #line 481 "lg.ypp" {(yyval.cexp)=FIf((yyvsp[(3) - (7)].cexp),(yyvsp[(5) - (7)].cexp),(yyvsp[(7) - (7)].cexp));} break; case 99: #line 482 "lg.ypp" { (yyval.cexp)=C_F0(new E_block((yyvsp[(2) - (3)].cinst),(yyvsp[(3) - (3)].cexp)),atype()) ;} break; case 100: #line 484 "lg.ypp" { /* <> */ (yyval.cexp)=0;currentblock->NewID(atype(),(yyvsp[(2) - (3)].str),C_F0(TheOperators,"[border]",(yyvsp[(3) - (3)].args)));} break; case 101: #line 486 "lg.ypp" { (yyval.cexp)=0;currentblock->NewID(atype(),(yyvsp[(2) - (6)].str),C_F0(TheOperators,"[border]",(yyvsp[(4) - (6)].args)));} break; case 102: #line 489 "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 493 "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 497 "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 504 "lg.ypp" {(yyval.cexp) = (yyvsp[(7) - (7)].cexp); ;} break; case 106: #line 507 "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) ;} break; case 107: #line 516 "lg.ypp" { (yyval.args) = ((yyvsp[(1) - (2)].args) += (yyvsp[(2) - (2)].cexp)); currentblock->close(currentblock);} break; case 109: #line 523 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));;} break; case 116: #line 537 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 117: #line 538 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"+=",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 118: #line 539 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"-=",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 119: #line 540 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"*=",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 120: #line 541 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"/=",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 121: #line 542 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,".*=",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 122: #line 543 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"./=",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 124: #line 549 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"?:",(yyvsp[(1) - (5)].cexp),(yyvsp[(3) - (5)].cexp),(yyvsp[(5) - (5)].cexp));} break; case 125: #line 550 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"::",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 126: #line 551 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,"::",(yyvsp[(1) - (5)].cexp),(yyvsp[(3) - (5)].cexp),(yyvsp[(5) - (5)].cexp));} break; case 128: #line 556 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 129: #line 557 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 130: #line 558 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 131: #line 559 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 132: #line 560 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 133: #line 561 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 134: #line 562 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 135: #line 563 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 136: #line 564 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 137: #line 565 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 138: #line 566 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 139: #line 567 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 140: #line 568 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 141: #line 569 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 142: #line 570 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 143: #line 571 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 144: #line 572 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 145: #line 573 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 146: #line 574 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 147: #line 579 "lg.ypp" {(yyval.cexp)=(yyvsp[(1) - (1)].cexp);} break; case 148: #line 580 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,":");} break; case 149: #line 581 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,":",(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 150: #line 582 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,":",(yyvsp[(1) - (5)].cexp),(yyvsp[(3) - (5)].cexp),(yyvsp[(5) - (5)].cexp));} break; case 151: #line 586 "lg.ypp" {(yyval.args)=0;} break; case 152: #line 587 "lg.ypp" {(yyval.args)=Find((yyvsp[(1) - (1)].str));} break; case 153: #line 588 "lg.ypp" {(yyval.args)=Find((yyvsp[(1) - (1)].str));} break; case 154: #line 589 "lg.ypp" {(yyval.args)=Find((yyvsp[(1) - (1)].str));} break; case 155: #line 590 "lg.ypp" { (yyval.args)=make_pair((yyvsp[(1) - (3)].str),(yyvsp[(3) - (3)].cexp));} break; case 156: #line 591 "lg.ypp" {(yyval.args)=(yyvsp[(1) - (1)].cexp);} break; case 157: #line 592 "lg.ypp" { (yyval.args) = ((yyvsp[(1) - (3)].args) += Find((yyvsp[(3) - (3)].str))) ;} break; case 158: #line 593 "lg.ypp" { (yyval.args) = ((yyvsp[(1) - (3)].args) += Find((yyvsp[(3) - (3)].str))) ;} break; case 159: #line 594 "lg.ypp" { (yyval.args) = ((yyvsp[(1) - (3)].args) += Find((yyvsp[(3) - (3)].str))) ;} break; case 160: #line 595 "lg.ypp" { (yyval.args) = ((yyvsp[(1) - (3)].args) += (yyvsp[(3) - (3)].cexp)) ;} break; case 161: #line 596 "lg.ypp" { (yyval.args)= ((yyvsp[(1) - (5)].args)+= make_pair((yyvsp[(3) - (5)].str),(yyvsp[(5) - (5)].cexp))) ;} break; case 162: #line 599 "lg.ypp" {(yyval.args)=(yyvsp[(1) - (1)].cexp);} break; case 163: #line 600 "lg.ypp" {(yyval.args) = ((yyvsp[(1) - (3)].args) += (yyvsp[(3) - (3)].cexp)) ;} break; case 165: #line 605 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(1) - (2)].oper),(yyvsp[(2) - (2)].cexp));} break; case 167: #line 609 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 168: #line 610 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (3)].oper),(yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].cexp));} break; case 169: #line 611 "lg.ypp" {(yyval.cexp)=C_F0(TheOperators,(yyvsp[(2) - (2)].oper),(yyvsp[(1) - (2)].cexp));} break; case 170: #line 615 "lg.ypp" {(yyval.cexp)=Find((yyvsp[(1) - (1)].str));;} break; case 171: #line 616 "lg.ypp" {(yyval.cexp)= CConstant((yyvsp[(1) - (1)].lnum));} break; case 172: #line 617 "lg.ypp" {(yyval.cexp)= CConstant((yyvsp[(1) - (1)].dnum));} break; case 173: #line 618 "lg.ypp" {(yyval.cexp)= CConstant(complex(0,(yyvsp[(1) - (1)].dnum)));} break; case 174: #line 619 "lg.ypp" {(yyval.cexp)= CConstant((yyvsp[(1) - (1)].str));} break; case 175: #line 620 "lg.ypp" {(yyval.cexp)=C_F0((yyvsp[(1) - (4)].cexp),(yyvsp[(2) - (4)].oper),(yyvsp[(3) - (4)].args));;} break; case 176: #line 621 "lg.ypp" {(yyval.cexp)=C_F0((yyvsp[(1) - (4)].cexp),(yyvsp[(2) - (4)].oper),(yyvsp[(3) - (4)].cexp));} break; case 177: #line 622 "lg.ypp" {(yyval.cexp)=C_F0((yyvsp[(1) - (6)].cexp),(yyvsp[(2) - (6)].oper),(yyvsp[(3) - (6)].cexp),(yyvsp[(5) - (6)].cexp));} break; case 178: #line 623 "lg.ypp" {(yyval.cexp)=C_F0((yyvsp[(1) - (3)].cexp),"[]");} break; case 179: #line 624 "lg.ypp" { (yyval.cexp)=C_F0((yyvsp[(1) - (3)].cexp),(yyvsp[(3) - (3)].str)) ;;} break; case 180: #line 625 "lg.ypp" { (yyval.cexp)=C_F0(Find((yyvsp[(1) - (3)].str)),(yyvsp[(3) - (3)].str)) ;;} break; case 181: #line 626 "lg.ypp" { (yyval.cexp)=C_F0(Find((yyvsp[(1) - (4)].str)),(yyvsp[(2) - (4)].oper),(yyvsp[(3) - (4)].args)) ;;} break; case 182: #line 627 "lg.ypp" { (yyval.cexp)=C_F0(Find((yyvsp[(1) - (3)].str)),(yyvsp[(3) - (3)].str)) ;;} break; case 183: #line 628 "lg.ypp" { (yyval.cexp)=C_F0(Find((yyvsp[(1) - (4)].str)),(yyvsp[(2) - (4)].oper),(yyvsp[(3) - (4)].args)) ;;} break; case 184: #line 629 "lg.ypp" { (yyval.cexp)=C_F0(Find((yyvsp[(1) - (3)].str)),(yyvsp[(3) - (3)].str)) ;;} break; case 185: #line 630 "lg.ypp" { (yyval.cexp)=C_F0(Find((yyvsp[(1) - (4)].str)),(yyvsp[(2) - (4)].oper),(yyvsp[(3) - (4)].args)) ;;} break; case 186: #line 631 "lg.ypp" {(yyval.cexp)=C_F0(TheRightOperators,(yyvsp[(2) - (2)].oper),(yyvsp[(1) - (2)].cexp));} break; case 187: #line 632 "lg.ypp" {(yyval.cexp)=C_F0(TheRightOperators,(yyvsp[(2) - (2)].oper),(yyvsp[(1) - (2)].cexp));} break; case 188: #line 633 "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 189: #line 642 "lg.ypp" {(yyval.cexp)=(yyvsp[(2) - (3)].cexp);} break; case 190: #line 643 "lg.ypp" { (yyval.cexp)=C_F0(TheOperators,"[]",(yyvsp[(2) - (3)].args));} break; /* Line 1267 of yacc.c. */ #line 3002 "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 648 "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; //string StrVersionNumber(); /// Called by mainff() and activates the bison parser by calling yyparse() int Compile() { extern YYSTYPE *plglval; // modif FH plglval = &lglval; int retvalue=0; // int ok; currentblock=0; Block::open(currentblock); try { UnShowAlloc =0; retvalue=yyparse (); // compile 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) { ffapi::init(); 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; 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) {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); EnvironmentLoad(); // just before compile verbosity=vvold; retvalue= Compile(); // cout << " xxxxx " << retvalue << " " << ThePlotStream << endl; if(end_parallele) end_parallele(); // currentblock->close(currentblock).eval(thestack); fingraphique(); // FFCS: divert stream to FFCS if(ThePlotStream){ ffapi::ff_pclose(ThePlotStream); ThePlotStream=0; } Destroylex( zzzfff); // ClearMem(); return retvalue; } /* FFCS: emacs configuration for this file */ /*! * Local Variables: * mode:antlr * ispell-local-dictionary:"british" * coding:utf-8 * End: */ freefem++-3.26-2/src/lglib/lg.tab.hpp000644 000767 000767 00000010122 12235141620 016324 0ustar00hecht000000 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 126 "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.26-2/src/lglib/lg.ypp000644 000767 000767 00000071455 12240775536 015637 0ustar00hecht000000 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" #define eflval yylval #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 "AFunction.hpp" // to reserve space to graphical pointer function #include "rgraph.hpp" #include "RNM.hpp" #include "fem.hpp" #include "FESpacen.hpp" #include "FESpace.hpp" #include "MeshPoint.hpp" #include "lgfem.hpp" #include "lex.hpp" #include "environment.hpp" 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 *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 &); 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; %} %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 { 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 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; NbPtr = ShowAlloc("end execution -- ",lg1) - NbPtr; if (NbPtr) { cout << " ######## We forget of deleting " << NbPtr << " Nb pointer, " << lg1-lg0 << "Bytes " << " , mpirank " << mpirank <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 [[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} | declaration {$$=$1} | 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 } ; /* <> */ border_expr: bornes instruction { $$ = ($1 += $2); currentblock->close(currentblock)} ; 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_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 {$$=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 | 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)} | FESPACE1 {$$=Find($1)} | FESPACE3 {$$=Find($1)} | id '=' no_set_expr { $$=make_pair($1,$3)} | sub_script_expr {$$=$1} | parameters ',' FESPACE { $$ = ($1 += Find($3)) } | parameters ',' FESPACE1 { $$ = ($1 += Find($3)) } | parameters ',' FESPACE3 { $$ = ($1 += Find($3)) } | parameters ',' sub_script_expr { $$ = ($1 += $3) } | 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 | unop pow_expr %prec UNARY {$$=C_F0(TheOperators,$1,$2)} ; pow_expr: 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: ID {$$=Find($1);} | LNUM {$$= CConstant($1)} | DNUM {$$= CConstant($1)} | CNUM {$$= CConstant(complex(0,$1))} | STRING {$$= CConstant($1)} | 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; //string StrVersionNumber(); /// Called by mainff() and activates the bison parser by calling yyparse() int Compile() { extern YYSTYPE *plglval; // modif FH plglval = &lglval; int retvalue=0; // int ok; currentblock=0; Block::open(currentblock); try { UnShowAlloc =0; retvalue=yyparse (); // compile 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) { ffapi::init(); 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; 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) {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); EnvironmentLoad(); // just before compile verbosity=vvold; retvalue= Compile(); // cout << " xxxxx " << retvalue << " " << ThePlotStream << endl; if(end_parallele) end_parallele(); // currentblock->close(currentblock).eval(thestack); fingraphique(); // FFCS: divert stream to FFCS if(ThePlotStream){ ffapi::ff_pclose(ThePlotStream); ThePlotStream=0; } Destroylex( zzzfff); // ClearMem(); return retvalue; } /* FFCS: emacs configuration for this file */ /*! * Local Variables: * mode:antlr * ispell-local-dictionary:"british" * coding:utf-8 * End: */ freefem++-3.26-2/src/lglib/Makefile.am000644 000767 000767 00000001542 12235141673 016516 0ustar00hecht000000 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.26-2/src/lglib/Makefile.in000644 000767 000767 00000051032 12245613204 016521 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 .PRECIOUS: 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 # <> 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.26-2/src/lglib/mymain.cpp000755 000767 000767 00000000411 12167254041 016453 0ustar00hecht000000 000000 /// \file int mainff (int argc, char **argv); extern void init_ptr_parallelepmi(); /// called by platform-dependent main() in src/Graphics/sansrgraph.cpp and others. int mymain (int argc, char **argv) { init_ptr_parallelepmi(); return mainff(argc,argv); } freefem++-3.26-2/src/Graphics/DefColor.cpp000644 000767 000767 00000005435 11406226635 017340 0ustar00hecht000000 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.26-2/src/Graphics/ff-win32.cpp000644 000767 000767 00000004246 12033712775 017177 0ustar00hecht000000 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.26-2/src/Graphics/ffglut.cpp000644 000767 000767 00000220460 12234451342 017122 0ustar00hecht000000 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) { 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; cout << (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.26-2/src/Graphics/._ffglut.hpp000644 000767 000024 00000000253 12125101311 020331 0ustar00hechtstaff000000 000000 Mac OS X  2yATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/src/Graphics/ffglut.hpp000644 000767 000767 00000021424 12125101311 017111 0ustar00hecht000000 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.26-2/src/Graphics/ffthreads.cpp000644 000767 000767 00000004561 11406226635 017610 0ustar00hecht000000 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.26-2/src/Graphics/ffthreads.hpp000644 000767 000767 00000003713 11406226635 017613 0ustar00hecht000000 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.26-2/src/Graphics/getprog-unix.hpp000644 000767 000767 00000014426 12167254041 020275 0ustar00hecht000000 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 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 " <10) printf(" verbosity : %ld\n",verbosity); } else if (strcmp(argv[i],"-nw")==0 ) { consoleatend=false; noffglut=true; NoGraphicWindow=true; } 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 << " 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" ; 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.26-2/src/Graphics/gggg.cpp000644 000767 000767 00000002612 11651763423 016553 0ustar00hecht000000 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 #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.26-2/src/Graphics/glrgraph.hpp000644 000767 000767 00000120464 12033706637 017460 0ustar00hecht000000 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.26-2/src/Graphics/macglrgraf.cpp000644 000767 000767 00000001664 11406226635 017750 0ustar00hecht000000 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.26-2/src/Graphics/macrgraf.cpp000644 000767 000767 00000071665 11500777104 017432 0ustar00hecht000000 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.26-2/src/Graphics/Makefile.am000644 000767 000767 00000000475 12167254041 017167 0ustar00hecht000000 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.26-2/src/Graphics/Makefile.in000644 000767 000767 00000035546 12245613204 017204 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 .PRECIOUS: 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 # 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.26-2/src/Graphics/mode_open.hpp000644 000767 000767 00000000317 11406226635 017607 0ustar00hecht000000 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.26-2/src/Graphics/Pcrgraph.cpp000644 000767 000767 00000113615 12033706613 017405 0ustar00hecht000000 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.26-2/src/Graphics/xglrgraf.cpp000644 000767 000767 00000001677 11406226635 017463 0ustar00hecht000000 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.26-2/src/Graphics/Xrgraph.cpp000644 000767 000767 00000074351 12033706624 017257 0ustar00hecht000000 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.26-2/src/fflib/AddNewFE.h000644 000767 000767 00000006421 12234450000 016164 0ustar00hecht000000 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.26-2/src/fflib/AFunction.cpp000644 000767 000767 00000211565 12232503272 017047 0ustar00hecht000000 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" #include #include "array_init.hpp" 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 } 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 long isNaN(double x){return isnan(x);} long isInf(double x){return isinf(x);} long isNormal(double x){return isnormal(x);} //int ShowAlloc(const char *s, size_t lg); 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("cin",CConstant(&cin)); Global.New("append",CConstant(ios::app)); 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 ); 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 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("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("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 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("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");} long 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; if(!(pv >=0 && 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; #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; 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;} }; // un table Iden 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: 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 ? 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() is called (see \ref index). class E_F0 :public CodeAlloc { public: 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; } // 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) 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 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 { // 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; protected: Expression f; // the expression code aType r; // the expression type 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 C_F0(const Type_Expr & a):f(a.second),r(a.first) {} 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(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() C_F0(const Polymorphic * pop,const char *op); // unary operator C_F0(const Polymorphic * pop,const char *op,const C_F0 & a); // binary operator 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 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_F0mps { 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;} // 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) {} }; 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 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)); } /// <> 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 { 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; } }; /// <> class CListOfInst{ private: 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:~/ff/draft/src/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]] 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; Expression n; const E_BorderN * next; 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),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);} long Nbseg(Stack stack) const { return GetAny((*n)(stack));} double from(Stack stack) const ;//{ return GetAny((*n)(stack));} double to(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; 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){} }; 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; basicAC_F0_wa * tab; long label; E_Border(const E_Array * a) : xvar(0),xfrom(0),xto(0),xcode(0), tab(a? a->v:0) ,label(++Count) { assert(tab); Add("(",new OneOperator_borderN(this)); } E_Border(const basicAC_F0 & aa) : xvar(to(aa[0])), xfrom(to(aa[1])), xto(to(aa[2])), xcode(aa[3].LeftValue()), tab(0), label(++Count) { Add("(",new OneOperator_borderN(this));} 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),n(::to(nn)),next(nx) { 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 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) { register 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));} typedef list ListOfTOfId; extern list tables_of_identifier; 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 << " unknow 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) { *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 << " unknow 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(); //{} }; 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){} }; // 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(this && 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;} }; /// <> 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 queue > 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.26-2/src/fflib/AFunction2.cpp000644 000767 000767 00000070033 12240775536 017137 0ustar00hecht000000 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" queue > debugstack; 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) 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); } 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";*/ *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); *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; } 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) 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 { debugstack.push(pair(this,TheCurrentLine)); const int lgsave=BeginOffset*sizeof(void*); char save[lgsave]; AnyType ret=Nothing; memcpy(save,s,lgsave); // save register 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 register TheCurrentLine=debugstack.front().second; debugstack.pop(); throw ; } (*clean)(s); // the clean is done in CleanE_Routine delete . // delete [] listparam; after return memcpy(s,save,lgsave); // restore register TheCurrentLine=debugstack.front().second; debugstack.pop(); // 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 <name<< " at line " < > &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.26-2/src/fflib/AFunction_ext.hpp000644 000767 000767 00000056333 11703266043 017740 0ustar00hecht000000 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[0]->CastTo(args[1]), t[1]->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.26-2/src/fflib/AnyType.hpp000644 000767 000767 00000012537 12240775536 016572 0ustar00hecht000000 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 class 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.26-2/src/fflib/array_complex.cpp000644 000767 000767 00000007152 11473460740 020031 0ustar00hecht000000 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.26-2/src/fflib/array_init.hpp000644 000767 000767 00000002131 11406226635 017321 0ustar00hecht000000 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.26-2/src/fflib/._array_long.cpp000644 000767 000024 00000000252 12051131554 020525 0ustar00hechtstaff000000 000000 Mac OS X  2xATTRcom.apple.TextEncodingiso-8859-1;513freefem++-3.26-2/src/fflib/array_long.cpp000644 000767 000767 00000012355 12051131554 017311 0ustar00hecht000000 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)); } void xxxx() { } freefem++-3.26-2/src/fflib/._array_real.cpp000644 000767 000024 00000000252 11777233012 020517 0ustar00hechtstaff000000 000000 Mac OS X  2xATTRcom.apple.TextEncodingiso-8859-1;513freefem++-3.26-2/src/fflib/array_real.cpp000644 000767 000767 00000006654 11777233012 017310 0ustar00hecht000000 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)); // ArrayDCL(); } freefem++-3.26-2/src/fflib/._array_resize.hpp000644 000767 000024 00000000253 12107063771 021104 0ustar00hechtstaff000000 000000 Mac OS X  2yATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/src/fflib/array_resize.hpp000644 000767 000767 00000001377 12107063771 017671 0ustar00hecht000000 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.26-2/src/fflib/._array_tlp.hpp000644 000767 000024 00000000253 12232437262 020401 0ustar00hechtstaff000000 000000 Mac OS X  2yATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/src/fflib/array_tlp.hpp000644 000767 000767 00000160577 12232437262 017176 0ustar00hecht000000 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" #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;; 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(" 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 >(v[i]); 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 *>(); // 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;} }; 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 ,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 ,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 ,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 ,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 ,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 ,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 ,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 > > > ); // 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 > ); 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.26-2/src/fflib/CodeAlloc.cpp000644 000767 000767 00000007245 11406226635 017013 0ustar00hecht000000 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" /* 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.26-2/src/fflib/CodeAlloc.hpp000644 000767 000767 00000003674 11406226635 017022 0ustar00hecht000000 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 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.26-2/src/fflib/endian.hpp000644 000767 000767 00000007640 11406226635 016430 0ustar00hecht000000 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.26-2/src/fflib/._environment.cpp000644 000767 000024 00000000252 12234452117 020740 0ustar00hechtstaff000000 000000 Mac OS X  2xATTRcom.apple.TextEncodingiso-8859-1;513freefem++-3.26-2/src/fflib/environment.cpp000644 000767 000767 00000021631 12234452117 017521 0ustar00hecht000000 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; #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]; 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.26-2/src/fflib/environment.hpp000644 000767 000767 00000002405 11406226635 017530 0ustar00hecht000000 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.26-2/src/fflib/error.hpp000644 000767 000767 00000007067 11406226635 016326 0ustar00hecht000000 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.26-2/src/fflib/ff++.hpp000644 000767 000767 00000001663 11654735104 015713 0ustar00hecht000000 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.26-2/src/fflib/ffapi.cpp000755 000767 000767 00000016640 12167254041 016252 0ustar00hecht000000 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 #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 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 std::istream *cin(){return &std::cin;} std::ostream *cout(){return &std::cout;} std::ostream *cerr(){return &std::cerr;} // FFCS - ::stdout not accepted under mingw32 // need #include FILE *ffstdout(){return stdout;} FILE *ffstderr(){return stderr;} FILE *ffstdin(){return stdin;} void newplot(){} FILE *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 } int ff_pclose(FILE *stream){ #ifdef FFLANG // nothing to close in FFCS return 0; #else return pclose(stream); #endif } size_t 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); } size_t 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; } int 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; } int ff_ferror(FILE *stream){ #ifndef FFLANG return ferror(stream); #else return 0; #endif } int ff_feof(FILE *stream){ #ifndef FFLANG return feof(stream); #else return 0; #endif } void wintextmode(FILE *f){ #ifndef FFLANG #ifdef WIN32 // need #include _setmode(fileno(f),O_TEXT); #endif #endif } void winbinmode(FILE *f){ #ifndef FFLANG #ifdef WIN32 _setmode(fileno(f),O_BINARY); #endif #endif } void 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" MPI_Init(&argc,&argv); #endif #endif } void mpi_finalize(){ #ifndef FFLANG #ifdef PARALLELE MPI_Finalize(); #endif #endif } bool protectedservermode(){ #ifdef FFLANG return !options->LocalClient; #else return false; #endif } void init(){ ffapi::fwriteinit; ffapi::winbinmode; ffapi::wintextmode; ffapi::mpi_finalize; ffapi::cin; ffapi::cerr; ffapi::cout; ffapi::ff_feof; ffapi::newplot; ffapi::ff_popen; ffapi::mpi_init; ffapi::ff_ferror; ffapi::ff_fflush; ffapi::ff_fwrite; ffapi::ff_pclose; ffapi::protectedservermode; } } /// Local Variables: /// mode:c++ /// ispell-local-dictionary:"british" /// coding:utf-8 /// End: freefem++-3.26-2/src/fflib/ffapi.hpp000755 000767 000767 00000007237 12240775536 016272 0ustar00hecht000000 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 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(); // 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(); } #endif // FFAPI_HPP /// Local Variables: /// mode:c++ /// ispell-local-dictionary:"british" /// coding:utf-8 /// End: freefem++-3.26-2/src/fflib/ffstack.hpp000644 000767 000767 00000023152 12167254041 016604 0ustar00hecht000000 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 // 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() { bool ret= !stackptr.empty(); if(ret) { topmemory4tmp=0;// clean the tmp allocation 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) {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.26-2/src/fflib/global.cpp000644 000767 000767 00000005104 12167254041 016413 0ustar00hecht000000 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 "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 mylex *zzzfff; bool lexdebug; #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; 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; bool CodeAlloc::sort=true; bool CodeAlloc::cleanning=false; bool echo_edp=true; // add F.H of remove script dump // add F. Hecht EnvironmentData ffenvironment; freefem++-3.26-2/src/fflib/._glumesh2D.cpp000755 000767 000024 00000000252 12130577652 020240 0ustar00hechtstaff000000 000000 Mac OS X  2xATTRcom.apple.TextEncodingiso-8859-1;513freefem++-3.26-2/src/fflib/glumesh2D.cpp000755 000767 000767 00000027234 12130577652 017026 0ustar00hecht000000 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[i],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.26-2/src/fflib/InitFunct.cpp000644 000767 000767 00000004371 11656307615 017073 0ustar00hecht000000 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; } \ int DoLoadInit() { \ if(verbosity>9) \ cout << " **** " << NM << " ****\n" ; \ addInitFunct(10000,&AutoLoadInit,NM); \ return 2;} \ \ static int callDoLoadInit=DoLoadInit(); #define LOADINIT(TI) LOADINITNM(TI init,__FILE__) #define LOADFUNC(FC) LOADINITNM(FC() ,__FILE__) #endif freefem++-3.26-2/src/fflib/lex.cpp000644 000767 000767 00000051352 12240775536 015762 0ustar00hecht000000 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 ( ret == ID) while ((SetMacro(ret))) ((void) 0); if ( ret == ID) while ((CallMacro(ret))) ((void) 0); 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:" <::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 expantion "<< 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(ret== ENDOFFILE) break; if (nbparam && ret == ID) { MapMacroParam::const_iterator j=lp.find(buf); if ( j != lp.end()) expandtxt+=j->second; else expandtxt+=buf; } 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; 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 initialized in [[file:../lglib/lg.ypp::zzzfff Newlex cout echo_edp]] extern mylex *zzzfff; #endif freefem++-3.26-2/src/fflib/lgfem.cpp000644 000767 000767 00000554217 12240775536 016274 0ustar00hecht000000 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 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 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=5; 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; // 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))); 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 );} else ret = NLCG(AA,MatriceIdentite(n),x,nbitermax,eps, gcverb); } else if (C) { MatF_O CC(n,stack,C); ret = ConjuguedGradient2(AA,CC,x,*bb,nbitermax,eps, gcverb );} else ret = ConjuguedGradient2(AA,MatriceIdentite(n),x,*bb,nbitermax,eps, gcverb); if(veps) *veps = -(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);} 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) } }; 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 =6; 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); 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))); 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; // int res=GMRES(a,(KN &)x, (const KN &)b,*this,H,k,nn,epsr); 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 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 (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,bbgmres); ret=GMRES(AA,(KN &)x, (const KN &)b,CC,H,k,nbitermax,epsr,verb);} else ret=GMRES(AA,(KN &)x, (const KN &)b,MatriceIdentite(n),H,k,nbitermax,epsr,verb); } /* if (C) { MatF_O CC(n,stack,C); ret = ConjuguedGradient2(AA,CC,x,nbitermax,eps, 51L-Min(Abs(verbosity),50L) );} else ret = ConjuguedGradient2(AA,MatriceIdentite(n),x,nbitermax,eps, 51L-Min(Abs(verbosity),50L));*/ // if( nargs[3]) *GetAny((*nargs[3])(stack)) = -(eps); 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) } }; 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 (),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();} }; class Plot : public 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)) ;} }; static basicAC_F0::name_and_type name_param[] ; // FFCS: added new parameters for VTK graphics static const int n_name_param =42 ; Expression bb[4]; 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=106; //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 static E_F0 * f(const basicAC_F0 & args) { return new Plot(args);} 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(di->islevelset() && (CDomainOfIntegration::int1d!=kind) ) InternalError("So no levelset integration type on no int1d case (10)"); if(dim==2) { 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; 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,Th[ie].lab,R2(E.y,-E.x)/le,ie); 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) { const Mesh3 & Th = * GetAny( (*di->Th)(stack) ); ffassert(&Th); if (verbosity >3) { if (all) cout << " all " << endl ; else cout << endl; } if (kind==CDomainOfIntegration::int2d) { 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) { 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; } 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 to hight ???? 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; R ddt = GetAny((*dt)(s)); if (ddt) { bool ddd=verbosity>100; 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 = rg; 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 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 void DclTypeMatrix() { Dcl_Type* >(InitP >,Destroy >); 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;} 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 ); //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_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 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 // 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 ); 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)); // 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("[","",new OneOperator2_FE_get_elmnt());// new version FH sep 2009 Add("[","",new OneOperator2_FE_get_elmnt()); // 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.26-2/src/fflib/._lgfem.hpp000644 000767 000024 00000000253 12206617706 017502 0ustar00hechtstaff000000 000000 Mac OS X  2yATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/src/fflib/lgfem.hpp000644 000767 000767 00000061473 12206617706 016272 0ustar00hecht000000 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 * [NN]) { for (int i=0;iN;i++) xx[i]=new FEbase(ppVh); } ~FEbaseArray() { // cout << " ~FEbaseArray " << endl; for (int i=0;iN;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 < this->N; ++j) yy[j] = xx[j]; for(unsigned int j = this->N; 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; 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; 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.26-2/src/fflib/lgmat.cpp000644 000767 000767 00000260210 12232505657 016265 0ustar00hecht000000 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.26-2/examples++-load/shell.edp000644 000767 000767 00000000440 12123017524 017251 0ustar00hecht000000 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.26-2/examples++-load/SortedList.h000755 000767 000767 00000060610 11714503141 017725 0ustar00hecht000000 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.26-2/examples++-load/._splitedges.cpp000644 000767 000024 00000000253 12021147346 021547 0ustar00hechtstaff000000 000000 Mac OS X  2yTEXTATTRcom.apple.TextEncodingUTF-8;134217984freefem++-3.26-2/examples++-load/splitedges.cpp000644 000767 000767 00000015117 12021147346 020331 0ustar00hecht000000 000000 // $Id$ #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 // Init::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)); } LOADINIT(Init); // une variable globale qui serat construite au chargement dynamique Init::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); */ } freefem++-3.26-2/examples++-load/splitedges.edp000644 000767 000767 00000000317 11556312310 020310 0ustar00hecht000000 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 // Init::Init() soit appele a moment du chargement dynamique // du fichier // class Init { public: Init(); }; LOADINIT(Init); // une variable globale qui serat construite au chargement dynamique Init::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); */ } freefem++-3.26-2/examples++-load/splitmesh3.edp000644 000767 000767 00000000121 11406142255 020234 0ustar00hecht000000 000000 load "splitmesh3" mesh Th=square(5,5); mesh Th3=splitmesh3(Th); plot(Th3,wait=1);freefem++-3.26-2/examples++-load/splitmesh6.cpp000644 000767 000767 00000010000 11654763720 020261 0ustar00hecht000000 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 // Init::Init() soit appele a moment du chargement dynamique // du fichier // class Init { public: Init(); }; LOADINIT(Init); // une variable globale qui serat construite au chargement dynamique Init::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); */ } freefem++-3.26-2/examples++-load/splitmesh6.edp000644 000767 000767 00000001315 11406142255 020245 0ustar00hecht000000 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.26-2/examples++-load/SuperLu.cpp000644 000767 000767 00000060267 12243127624 017576 0ustar00hecht000000 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; } LOADINIT(Init); Init::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)); } freefem++-3.26-2/examples++-load/SuperLU.edp000644 000767 000767 00000003540 12167254041 017512 0ustar00hecht000000 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; Init::Init() { Global.Add("symmetrizeCSR", "(", new OneOperator1_* >(symmetrizeCSR)); } freefem++-3.26-2/examples++-load/._TensorK.hpp000755 000767 000024 00000000253 11714263321 021001 0ustar00hechtstaff000000 000000 Mac OS X  2yATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/examples++-load/TensorK.hpp000755 000767 000767 00000102500 11714263321 017554 0ustar00hecht000000 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.26-2/examples++-load/test-ElementMixte.edp000644 000767 000767 00000013453 12167254041 021534 0ustar00hecht000000 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(); }; LOADINIT(Init1) // une variable globale qui serat construite au chargement dynamique Init1::Init1(){ // 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" freefem++-3.26-2/examples++-load/tetgencube.edp000644 000767 000767 00000004406 11406142255 020300 0ustar00hecht000000 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 = movemesh3(Th33, transfo=[mv2x,mv2y,mv2z], facemerge=0); medit("maillagesurf",Thmv2surf,wait=1); //savemesh(Thmv2surf,"maillagesurfacecylindre.mesh"); //medit("maillageplein",Thmv2); freefem++-3.26-2/examples++-load/tetgenholeregion_rugby.edp000644 000767 000767 00000005262 11406142255 022726 0ustar00hecht000000 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.26-2/examples++-load/thresholdings.cpp000644 000767 000767 00000005762 11654755670 021070 0ustar00hecht000000 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(); }; LOADINIT(Init1) // une variable globale qui serat construite au chargement dynamique Init1::Init1() { // 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)); } freefem++-3.26-2/examples++-load/thresholdings.edp000644 000767 000767 00000000473 11515554001 021025 0ustar00hecht000000 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.26-2/examples++-load/ttestio.edp000644 000767 000767 00000002605 12240775536 017660 0ustar00hecht000000 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.26-2/examples++-load/UMFPACK64.cpp000644 000767 000767 00000027736 12167254041 017442 0ustar00hecht000000 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.26-2/examples++-load/VarIneq2.edp000644 000767 000767 00000007705 12167254041 017611 0ustar00hecht000000 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(); }; LOADINIT(Init); Init::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> ); } freefem++-3.26-2/examples++-load/VTK_writer_3d.cpp000644 000767 000767 00000022712 12167254041 020615 0ustar00hecht000000 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(); }; LOADINIT(Init); Init::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> ); } freefem++-3.26-2/examples++-eigen/all.edp000644 000767 000767 00000004235 11406142255 017073 0ustar00hecht000000 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 : 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 : neuman.edp --------------------------------------------------------" << endl; verbosity=verbosityy; { include "neuman.edp";}; cout << "------------------------------------------------------------------------------ " << endl; freefem++-3.26-2/examples++-eigen/BeamEigenValue.edp000644 000767 000767 00000004563 11406142255 021140 0ustar00hecht000000 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 ="< 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 == " <=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.26-2/examples++-eigen/Makefile.in000644 000767 000767 00000077254 12245613203 017707 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 testeigen.edp WGM-sphere.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 .PRECIOUS: 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 # exand 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; \ else \ 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) testeigen.edp.log: testeigen.edp @p='testeigen.edp'; \ b='testeigen.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) .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 # $Id$ 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.26-2/examples++-eigen/neuman.edp000644 000767 000767 00000001575 12167254041 017614 0ustar00hecht000000 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;i_example for freefem_Pmessage:%3CCAOx3ZJS4gLDyuUqYrzdqxh7YUGba8ztqdx0oF84iz3OCsRRnEg@mail.gmail.com%3E 6Lq/0043;523ab105;Mail;22094C73-89F1-4F2E-AF31-BC64E38C951Cfreefem++-3.26-2/examples++-eigen/WGM-sphere.edp000644 000767 000767 00000012466 12221057016 020242 0ustar00hecht000000 000000 //Script for FreeFem++cs http://www.ann.jussieu.fr/~lehyaric/ffcs/index.htm //to compute WG eigen vector (magnetic field) and value (wave vector) // of axially symmetrical dielectric resonators // See Chaper 9 the example Whispering gallery modes of teh DOC. //Developed by I. S. Grudinin at JPL/Caltech //Copyright 2012 California Institute of Technology. Government sponsorship acknowledged. //If this script was helpful in a project that resulted in a publication, please cite our paper: //``Finite element modeling of coupled optical microdisk resonators for displacement sensing,'' //I. S. Grudinin and Nan Yu (2012) // J. Opt. Soc. Am. B //based on "Traceable 2-D finite-element simulation of the whispering-gallery modes of axisymmetric electromagnetic resonators" //by M. Oxborrow //IEEE TRANSACTIONS ON MICROWAVE THEORY AND TECHNIQUES Volume: 55 Issue: 6 Pages: 1209-1218 real radius=36; //approximate radius of the cavity real yb=-10,yt=-yb; //window yb=bottom and yt=top coordinates real xl=radius-5,xr=radius+3; //window xl=left and xr=right coordinates real angle=asin((yt)/radius); //angle of the sphere segment to model in radians int Nm=60; //number of mesh vertices per border real ne=1.46; //n_e-extraordinary refractive index (root of permittivity parallel to z-axis, epara) real no=1.46; //n_o-ordinary refractive index (root of permittivity orthogonal to z-axis, eorto) real nm=1; //refractive index of surrounding medium (air) int nev=4; // number of eigen values to find int M=213; //azimuthal mode order ~ 2Pi*n*R/lambda real alpha=1; //penalty term //describing the mesh: border W1l(t=0,1) { x=xl+(radius*cos(angle)-xl)*(1-t); y=yt; label=1;} // window upper border left border W1r(t=0,1) { x=xr-(xr-radius*cos(angle))*(t); y=yt; label=1;} // window upper border right border W2(t=0,1) { x=xr; y=yb+(yt-yb)*t; label=1;} // window right border border W3l(t=0,1) { x=xl+(radius*cos(angle)-xl)*(t); y=yb; label=1;} // window lower border left border W3r(t=0,1) { x=xr-(xr-radius*cos(angle))*(1-t); y=yb; label=1;} // window lower border right border W4(t=0,1) { x=xl; y=yt-(yt-yb)*t; label=1;} // window left border border S(t=0,1) { x=radius*cos((t-0.5)*2*angle); y=radius*sin((t-0.5)*2*angle); label=2;} //sphere segment mesh Th = buildmesh(W1r(Nm/4)+W1l(Nm/4)+W4(Nm)+W3l(Nm/4)+W3r(Nm/4)+W2(Nm)+S(Nm)); plot (Th, WindowIndex = 0); //setting subdomain parameters, i.e. refractive indices of resonator and surrounding air box fespace Ph(Th, P0); Ph reg=region; // function that returns region number of a point XY int ncav=reg(xl+1, 0); // cavity int nair=reg(xr-1, 0); //air Ph eorto=no^2*(region==ncav)+nm^2*(region==nair); //subdomains for epsilon values inside and outside the resonators Ph epara=ne^2*(region==ncav)+nm^2*(region==nair); //subdomains for epsilon values inside and outside the resonators //supplementary variables to store eigenvectors, defined on mesh Th with P2 elements - Largange quadratic. fespace Supp(Th, P2); Supp eHsqr; //3d vector FE space fespace Vh(Th,[P2,P2,P2]); Vh [Hr, Hphi, Hz], [vHr, vHphi, vHz]; //magnetic field components on Vh space and test functions vH real sigma =(M/(ne*radius))^2+2; // value of the shift (k^2), where the modes will be found //boundary condition macros macro EWall(Hr,Hphi, Hz) (dy(Hr)-dx(Hz)+Hr*N.x+Hz*N.y-epara*(Hz*M-dy(Hphi)*x)*N.y+eorto*(Hphi-Hr*M+dx(Hphi)*x)*N.x) // eom macro MWall(Hr,Hphi, Hz) (Hphi+Hz*N.x-Hr*N.y+epara*(Hz*M-dy(Hphi)*x)*N.x+eorto*(Hphi-Hr*M+dx(Hphi)*x)*N.y ) // eom //b matrix (see freefem++ manual, section 9 - eigenvalue problems) varf b([Hr, Hphi, Hz], [vHr, vHphi, vHz]) = int2d(Th)( x*(Hr*vHr+Hphi*vHphi+Hz*vHz) ); // OP = A - sigma B ; // the shifted matrix varf op([Hr, Hphi, Hz], [vHr, vHphi, vHz])= int2d(Th)( ( (eorto*(vHphi*Hphi-M*(vHphi*Hr+Hphi*vHr)+M^2*vHr*Hr)+epara*M^2*vHz*Hz)/x //A/r +eorto*(dx(vHphi)*(Hphi-M*Hr)+dx(Hphi)*(vHphi-M*vHr))-epara*M*(vHz*dy(Hphi)+Hz*dy(vHphi)) //B +x*(eorto*dx(vHphi)*dx(Hphi)+epara*((dx(vHz)-dy(vHr))*(dx(Hz)-dy(Hr))+dy(vHphi)*dy(Hphi))) //C )/(eorto*epara) +alpha*( (vHr*Hr-M*(vHphi*Hr+Hphi*vHr)+M^2*vHphi*Hphi)/x //D/r +(dx(vHr)+dy(vHz))*(Hr-M*Hphi)+(vHr-M*vHphi)*(dx(Hr)+dy(Hz)) //E +x*(dx(vHr)+dy(vHz))*(dx(Hr)+dy(Hz)) //F ) -sigma*x*(vHr*Hr+vHphi*Hphi+vHz*Hz) ) //electric wall boundary condition on the boundary of computation domain +int1d(Th,1)(EWall(Hr,Hphi,Hz)*EWall(vHr, vHphi, vHz)); //setting sparce matrices and assigning the solver UMFPACK to solve eigenvalue problem matrix B=b(Vh,Vh,solver=UMFPACK); matrix OP= op(Vh,Vh,solver=UMFPACK); real[int] ev(nev); // to store the nev eigenvalue Vh[int] [eHr,eHphi,eHz](nev); // to store the nev eigenvector //calling ARPACK on sparce matrices with the assigned solver UMFPACK: int k=EigenValue(OP,B,sym=true,sigma=sigma,value=ev,vector=eHr,tol=1e-10,maxit=0,ncv=0); k=min(k,nev); // sometimes the number of converged eigen values // can be greater than nev; //file to output mode values ofstream f("modes.txt"); //setting number of digits in the file output int nold=f.precision(11); 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.26-2/examples++-chapt3/condensor.edp000755 000767 000767 00000002032 12167254041 020406 0ustar00hecht000000 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.26-2/examples++-chapt3/._convects.edp000755 000767 000024 00000000253 11475226130 021465 0ustar00hechtstaff000000 000000 Mac OS X  2ySMLdSMULATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/examples++-chapt3/convects.edp000755 000767 000767 00000003235 11475226130 020245 0ustar00hecht000000 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.26-2/examples++-chapt3/heatex.edp000755 000767 000767 00000001545 12167254041 017702 0ustar00hecht000000 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.26-2/examples++-chapt3/lame.edp000755 000767 000767 00000001722 11406142255 017335 0ustar00hecht000000 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.26-2/examples++-chapt3/Makefile.am000644 000767 000767 00000002575 12212035762 017765 0ustar00hecht000000 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.26-2/examples++-chapt3/Makefile.in000644 000767 000767 00000104656 12245613203 017777 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 .PRECIOUS: 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 # exand 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; \ else \ 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 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.26-2/examples++-chapt3/membrane.edp000755 000767 000767 00000001710 12167254041 020204 0ustar00hecht000000 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.26-2/examples++-chapt3/._NSprojection.edp000755 000767 000024 00000000253 12062602005 022246 0ustar00hechtstaff000000 000000 Mac OS X  2yFRAdSMULATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/examples++-chapt3/NSprojection.edp000755 000767 000767 00000006740 12062602005 021032 0ustar00hecht000000 000000 // file NSprojection.edp border a0(t=1,0){ x=0; y=t; label=1;} border a1(t=0,1){ x=2*t; y=0; label=2;} border a2(t=0,1){ x=2; y=-t/2; label=2;} border a3(t=0,1){ x=2+18*t^1.2; y=-0.5; label=2;} border a4(t=0,1){ x=20; y=-0.5+1.5*t; label=3;} border a5(t=1,0){ x=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 func uBCin = 4*y*(1-y)*(y>0)*(x<2) ; func uBCout = 4./1.5*(y+0.5)*(1-y) *(x>19); Vh w,u = uBCin, v =0, p = 0, q=0; real area= int2d(Th)(1.); Vh ubc = uBCin + uBCout; real influx0 = int1d(Th,1) (ubc*N.x), outflux0 = int1d(Th,3) (ubc*N.x); if(verbosity>2) cout << " flux in " << influx0 << " out : " << outflux0 << endl; verbosity=1; real epsv = 1e-6; real epsu = 1e-6; real epsp = 1e-6; // def of Matrix dtMx and dtMy matrix dtM1x,dtM1y; { // 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; } for(int n=0;n<300;n++){ Vh uold = u, vold = v, pold=p; Vh f=convect([uold,vold],-dt,uold); // not used , g=convect([u,v],-dt,vold); real outflux = int1d(Th,3) (f*N.x); if(verbosity>2) cout << " flux = "<< influx0+outflux << " -- " ; f = f - (influx0+outflux)/outflux0 * uBCout; outflux = int1d(Th,3) (f*N.x); if(verbosity>2) cout << " out flux " << influx0+outflux << endl; assert( abs(influx0+outflux) < 1e-10); // WARNING the the output flux must be 0 .. 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) + on(3,u=f); 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); real meandiv = int2d(Th)(dx(u)+dy(v))/area; 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)-meandiv)*w/dt)+ on(3,q=0); real meanpq = int2d(Th)(pold - q)/area; // to have absolute epsilon in CG algorithm. cout << epsv << endl; epsv = -abs(epsv); epsu = -abs(epsu); epsp = -abs(epsp); p = pold-q-meanpq; pold[] = dtM1x*q[]; u[] += pold[]; pold[] = dtM1y*q[]; v[] += pold[]; /* u = u + dx(q)*dt; v = v + dy(q)*dt; */ if(n%50==49){ Th = adaptmesh(Th,[u,v],q,err=0.04,nbvx=100000); plot(Th, wait=true); ubc = uBCin + uBCout; // reinterpolate B.C. influx0 = int1d(Th,1) (ubc*N.x); outflux0 = int1d(Th,3) (ubc*N.x); 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; pold = pold; } real err = sqrt(int2d(Th)(square(u-uold)+square(v-vold))/Th.area) ; cout << " iter " << n << " Err L2 = " << err << endl; if(err < 1e-3) break; } plot(p,wait=1,ps="NSprojP.eps"); plot(u,wait=1,ps="NSprojU.eps"); freefem++-3.26-2/examples++-chapt3/optimcontrol.edp000644 000767 000767 00000002610 11406142255 021142 0ustar00hecht000000 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.26-2/examples++-chapt3/thermal.edp000755 000767 000767 00000001524 12167254041 020055 0ustar00hecht000000 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.26-2/examples++-chapt3/thermic.edp000755 000767 000767 00000002426 12167254041 020056 0ustar00hecht000000 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.26-2/examples++-bug/bug-arg-string.edp000644 000767 000767 00000001343 11406142255 020636 0ustar00hecht000000 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.26-2/examples++-bug/bugborder.edp000644 000767 000767 00000002177 11406142255 017767 0ustar00hecht000000 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.26-2/examples++-bug/bugf.edp000644 000767 000767 00000000435 11406142255 016732 0ustar00hecht000000 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.26-2/examples++-bug/bugifexp.edp000644 000767 000767 00000000164 12154364011 017614 0ustar00hecht000000 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.26-2/examples++-bug/bugv1.18.edp000644 000767 000767 00000000251 11406142255 017256 0ustar00hecht000000 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.26-2/examples++-bug/fe-vect.edp000644 000767 000767 00000000654 11406142255 017343 0ustar00hecht000000 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.26-2/examples++-bug/FE0.edp000644 000767 000767 00000001037 12130731352 016355 0ustar00hecht000000 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.26-2/examples++-bug/func.edp000644 000767 000767 00000000302 12051112444 016725 0ustar00hecht000000 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.26-2/examples++-bug/Makefile.am000644 000767 000767 00000000031 11406142255 017341 0ustar00hecht000000 000000 # $Id$ EXTRA_DIST=*.edp freefem++-3.26-2/examples++-bug/Makefile.in000644 000767 000767 00000035057 12245613203 017370 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 .PRECIOUS: 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 # 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.26-2/examples++-bug/SegmentationFault.edp000755 000767 000767 00000004224 11406142255 021443 0ustar00hecht000000 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 ="< 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.26-2/examples++-3d/cube.idp000644 000767 000767 00000001724 11406142255 016464 0ustar00hecht000000 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; } freefem++-3.26-2/examples++-3d/cylinder-3d.edp000644 000767 000767 00000000677 12167254041 017667 0ustar00hecht000000 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.26-2/examples++-3d/cylinder.edp000644 000767 000767 00000002125 12167254041 017351 0ustar00hecht000000 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.26-2/examples++-3d/dodecaedre01.mesh000644 000767 000767 00000061312 11406142255 020145 0ustar00hecht000000 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.26-2/examples++-3d/EqPoisson.edp000644 000767 000767 00000001550 11672406254 017466 0ustar00hecht000000 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.26-2/examples++-3d/fallingspheres.edp000644 000767 000767 00000002607 11744245643 020563 0ustar00hecht000000 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=movemesh3(ThSd,transfo=[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.26-2/examples++-3d/Makefile.in000644 000767 000767 00000117421 12245613203 017115 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 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 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 .PRECIOUS: 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 # exand 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; \ else \ 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) .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 all-local: all.edp regtests.edp freefem++.pref all.edp: Makefile (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;searchMethod=0;" ; \ echo \{ include \"$$i\"\;\}\; ;\ echo ' cout << "------------------------------------------------------------------------------ " << endl;' ;\ done) > $@ # 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.26-2/examples++-3d/meditddm.edp000644 000767 000767 00000003501 11435701373 017330 0ustar00hecht000000 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.26-2/examples++-3d/MeshSurface.idp000644 000767 000767 00000007646 11406142255 017764 0ustar00hecht000000 000000 load "msh3" load "medit" // 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 Sphere(real R,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 =cos(x)*cos(y); func f2 =cos(x)*sin(y); func f3 = sin(x); // partiel derivative 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; // 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/R;// 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*R,f2*R,f3*R],orientation=orientation,refface=ref); return ThS; } /* 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.26-2/examples++-3d/NSI3d-carac.edp000644 000767 000767 00000005716 11643543622 017504 0ustar00hecht000000 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.26-2/examples++/._aaa-adp.edp000644 000767 000024 00000000253 12131740306 017736 0ustar00hechtstaff000000 000000 Mac OS X  2yFRAdSMULATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/examples++/aaa-adp.edp000644 000767 000767 00000004360 12131740306 016516 0ustar00hecht000000 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" 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.26-2/examples++/Makefile.in000644 000767 000767 00000105652 12245613203 016614 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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++ DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 .PRECIOUS: 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 # exand 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; \ else \ 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 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 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 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.26-2/examples++/makeref.edp000644 000767 000767 00000011774 11412643014 016652 0ustar00hecht000000 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.26-2/examples++/NSP1P1b.edp000644 000767 000767 00000004036 11406142255 016321 0ustar00hecht000000 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.26-2/examples++/NSP1P2.edp000644 000767 000767 00000003754 11406142255 016166 0ustar00hecht000000 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.26-2/examples++/parareal.edp000644 000767 000767 00000006525 11406142255 017031 0ustar00hecht000000 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.26-2/examples++/testFE.edp000644 000767 000767 00000002350 12167254041 016426 0ustar00hecht000000 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.26-2/examples++/wafer-heating-laser-axi.edp000644 000767 000767 00000010653 11406142255 021643 0ustar00hecht000000 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.26-2/download/arpack/000755 000767 000767 00000000000 12245613624 015651 5ustar00hecht000000 000000 freefem++-3.26-2/download/AUTHORS000644 000767 000767 00000000547 11443625351 015465 0ustar00hecht000000 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.26-2/download/blacs/000755 000767 000767 00000000000 12245613624 015474 5ustar00hecht000000 000000 freefem++-3.26-2/download/blas/000755 000767 000767 00000000000 12245613624 015331 5ustar00hecht000000 000000 freefem++-3.26-2/download/f2c/000755 000767 000767 00000000000 12245613624 015062 5ustar00hecht000000 000000 freefem++-3.26-2/download/fftw/000755 000767 000767 00000000000 12245613624 015356 5ustar00hecht000000 000000 freefem++-3.26-2/download/gmm/000755 000767 000767 00000000000 12245613624 015170 5ustar00hecht000000 000000 freefem++-3.26-2/download/headers-sparsesolver.inc000644 000767 000767 00000011351 11406142255 021240 0ustar00hecht000000 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.26-2/download/hips/000755 000767 000767 00000000000 12245613624 015353 5ustar00hecht000000 000000 freefem++-3.26-2/download/hypre/000755 000767 000767 00000000000 12245613624 015537 5ustar00hecht000000 000000 freefem++-3.26-2/download/ipopt/000755 000767 000767 00000000000 12245613624 015543 5ustar00hecht000000 000000 freefem++-3.26-2/download/Makefile.am000755 000767 000767 00000012417 12243215576 016456 0ustar00hecht000000 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 \ ./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-4.10.0.inc \ ./mumps-seq/Makefile \ ./mumps/Makefile-mumps-4.10.0.inc \ ./mumps/MUMPS_4.10.0.patch \ ./parmetis/Makefile-parmetis.in \ ./parmetis/makefile \ ./parmetis/parmetis-3.1.1.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_5.1_esmumps.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 # 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=@TOOL_COMPILE_parmetis@ scalapack @TOOL_COMPILE_superludist@ @TOOL_COMPILE_mumps@ @TOOL_COMPILE_pastix@ \ @TOOL_COMPILE_hips@ @TOOL_COMPILE_parms@ LIST_SOFT=tetgen @TOOL_COMPILE_superlu@ fftw @TOOL_COMPILE_metis@ @TOOL_COMPILE_scotch@ @TOOL_COMPILE_mshmet@ @TOOL_COMPILE_yams@ \ @TOOL_COMPILE_mmg3d@ 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) WHERE-LD: tag-compile-pkg touch ../examples++-load/WHERE_LIBRARY-config ../examples++-load/WHERE_LIBRARY grep LD ../examples++-load/WHERE_LIBRARY ../examples++-load/WHERE_LIBRARY-config >WHERE-LD # 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.26-2/download/Makefile.in000644 000767 000767 00000064217 12245613202 016457 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs AUTHORS ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 \ ./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-4.10.0.inc \ ./mumps-seq/Makefile \ ./mumps/Makefile-mumps-4.10.0.inc \ ./mumps/MUMPS_4.10.0.patch \ ./parmetis/Makefile-parmetis.in \ ./parmetis/makefile \ ./parmetis/parmetis-3.1.1.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_5.1_esmumps.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 # 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 = @TOOL_COMPILE_parmetis@ scalapack @TOOL_COMPILE_superludist@ @TOOL_COMPILE_mumps@ @TOOL_COMPILE_pastix@ \ @TOOL_COMPILE_hips@ @TOOL_COMPILE_parms@ LIST_SOFT = tetgen @TOOL_COMPILE_superlu@ fftw @TOOL_COMPILE_metis@ @TOOL_COMPILE_scotch@ @TOOL_COMPILE_mshmet@ @TOOL_COMPILE_yams@ \ @TOOL_COMPILE_mmg3d@ 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 .PRECIOUS: 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= failcom='exit 1'; \ for f in x $$MAKEFLAGS; do \ case $$f in \ *=* | --[!k]*);; \ *k*) failcom='fail=yes';; \ esac; \ done; \ 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 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) WHERE-LD: tag-compile-pkg touch ../examples++-load/WHERE_LIBRARY-config ../examples++-load/WHERE_LIBRARY grep LD ../examples++-load/WHERE_LIBRARY ../examples++-load/WHERE_LIBRARY-config >WHERE-LD # 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.26-2/download/metis/000755 000767 000767 00000000000 12245613624 015531 5ustar00hecht000000 000000 freefem++-3.26-2/download/mmg3d/000755 000767 000767 00000000000 12245613624 015417 5ustar00hecht000000 000000 freefem++-3.26-2/download/mshmet/000755 000767 000767 00000000000 12245613624 015705 5ustar00hecht000000 000000 freefem++-3.26-2/download/mumps/000755 000767 000767 00000000000 12245613624 015551 5ustar00hecht000000 000000 freefem++-3.26-2/download/mumps-seq/000755 000767 000767 00000000000 12245613624 016337 5ustar00hecht000000 000000 freefem++-3.26-2/download/nlopt/000755 000767 000767 00000000000 12245613624 015544 5ustar00hecht000000 000000 freefem++-3.26-2/download/parmetis/000755 000767 000767 00000000000 12245613624 016234 5ustar00hecht000000 000000 freefem++-3.26-2/download/parms/000755 000767 000767 00000000000 12245613624 015532 5ustar00hecht000000 000000 freefem++-3.26-2/download/pastix/000755 000767 000767 00000000000 12245613624 015720 5ustar00hecht000000 000000 freefem++-3.26-2/download/scalapack/000755 000767 000767 00000000000 12245613624 016332 5ustar00hecht000000 000000 freefem++-3.26-2/download/scotch/000755 000767 000767 00000000000 12245613624 015673 5ustar00hecht000000 000000 freefem++-3.26-2/download/superlu/000755 000767 000767 00000000000 12245613624 016107 5ustar00hecht000000 000000 freefem++-3.26-2/download/superludist/000755 000767 000767 00000000000 12245613624 016773 5ustar00hecht000000 000000 freefem++-3.26-2/download/tetgen/000755 000767 000767 00000000000 12245613624 015676 5ustar00hecht000000 000000 freefem++-3.26-2/download/umfpack/000755 000767 000767 00000000000 12245613624 016036 5ustar00hecht000000 000000 freefem++-3.26-2/download/yams/000755 000767 000767 00000000000 12245613624 015361 5ustar00hecht000000 000000 freefem++-3.26-2/download/yams/freeyams.2012.02.05-return-values.patch000644 000767 000767 00000000346 12167254041 024055 0ustar00hecht000000 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.26-2/download/yams/._freeyams.2012.02.05.patch000644 000767 000024 00000000253 12021327602 022454 0ustar00hechtstaff000000 000000 Mac OS X  2yTEXTATTRcom.apple.TextEncodingUTF-8;134217984freefem++-3.26-2/download/yams/freeyams.2012.02.05.patch000644 000767 000767 00000030464 12021327602 021240 0ustar00hecht000000 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.26-2/download/yams/Makefile000644 000767 000767 00000006340 12167254041 017021 0ustar00hecht000000 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): -mkdir $(DIRPKG); cd $(DIRPKG);$(WGET) $(SERVER)/`basename $(PACKAGE)` # 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) -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.26-2/download/yams/makefile-yams.inc000644 000767 000767 00000002520 12167254041 020574 0ustar00hecht000000 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)/src/libMesh/ -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.26-2/download/yams/yamslib.c000644 000767 000767 00000035042 12167254041 017166 0ustar00hecht000000 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); } freefem++-3.26-2/download/yams/yamslib.h000644 000767 000767 00000012653 11477431571 017206 0ustar00hecht000000 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); #ifdef __cplusplus } #endif #ifdef __cplusplus } #endif freefem++-3.26-2/download/yams/yamslib_internal.h000644 000767 000767 00000002266 11406142255 021067 0ustar00hecht000000 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.26-2/download/umfpack/Makefile.am000644 000767 000767 00000015441 12240775536 020105 0ustar00hecht000000 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.0.2.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): cd $(DIRPKG);@WGET@ -N http://www.cise.ufl.edu/research/sparse/SuiteSparse/`basename $(SUITESPARSE_TGZ)` 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.26-2/download/umfpack/Makefile.in000644 000767 000767 00000052572 12245613203 020107 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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.0.2.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 .PRECIOUS: 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 # 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): cd $(DIRPKG);@WGET@ -N http://www.cise.ufl.edu/research/sparse/SuiteSparse/`basename $(SUITESPARSE_TGZ)` 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.26-2/download/umfpack/SuiteSparse_config.mk.in000644 000767 000767 00000034701 12115427416 022573 0ustar00hecht000000 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.26-2/download/tetgen/Makefile000755 000767 000767 00000004711 12167254041 017341 0ustar00hecht000000 000000 # and compiling extra libraries # ----------------------------------------- # $Id$ 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): cd $(DIRPKG);$(WGET) $(SERVER)/`basename $(PACKAGE)` 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.26-2/download/tetgen/patches.win64000644 000767 000767 00000012127 12167254041 020216 0ustar00hecht000000 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.26-2/download/tetgen/tetgen1.4.2.patch000644 000767 000767 00000003630 11625376054 020576 0ustar00hecht000000 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.26-2/download/superludist/make-superlu.inc000644 000767 000767 00000002756 12212072637 022107 0ustar00hecht000000 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.26-2/download/superludist/Makefile000644 000767 000767 00000005155 12212072373 020433 0ustar00hecht000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- # $Id$ 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 ## WGET=wget include make.inc superludist: FAIT # FFCS: more dependencies for parallel builds FAIT:$(SRCDIR) $(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) 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): $(PACKAGE_PATH) 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) $(PACKAGE_PATH): -mkdir $(DIRPKG); cd $(DIRPKG);$(WGET) $(SERVER)$(PACKAGE) #$(PACKAGE_PATH) # 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.26-2/download/superludist/superludist_2.3.patch000644 000767 000767 00000002140 11406142255 022751 0ustar00hecht000000 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.26-2/download/superludist/superludist_3.0-cast_warning.patch000644 000767 000767 00000002176 12167254041 025437 0ustar00hecht000000 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.26-2/download/superludist/superludist_3.0-operation_undefined.patch000644 000767 000767 00000001321 12167254041 026770 0ustar00hecht000000 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.26-2/download/superludist/superludist_3.0-printf.patch000644 000767 000767 00000000374 12167254041 024260 0ustar00hecht000000 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 freefem++-3.26-2/download/superludist/superludist_3.0-return_values.patch000644 000767 000767 00000011316 12167254041 025652 0ustar00hecht000000 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.26-2/download/superlu/make.inc000644 000767 000767 00000002016 11406142255 017511 0ustar00hecht000000 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.26-2/download/superlu/Makefile000755 000767 000767 00000007766 12167254041 017567 0ustar00hecht000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- # $Id$ 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): -mkdir $(DIRPKG); cd $(DIRPKG);$(WGET) $(SERVER)$(PACKAGE) # 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.26-2/download/scotch/Makefile000644 000767 000767 00000010251 12214307167 017330 0ustar00hecht000000 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 # ------------------------------- # 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/23391 INSTALL=../.. scotch_VERSION=5.1_esmumps scotch_VERSION_LOCAL=5.1.6_esmumps # 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" case `uname` in *CYGWIN*) cp Makefile.inc Makefile.inn; sed "s/COPTIONS =/COPTIONS = -D__VC__/" Makefile.inc; rm Makefile.inn ;; esac case `uname` in *CYGWIN*|*MINGW*) cp Makefile.inc Makefile.inn; sed -e "s/-DCOMMON_TIMING_OLD//" -e "s/-DCOMMON_RANDOM_FIXED_SEED/-DCOMMON_RANDOM_RAND -DCOMMON_RANDOM_FIXED_SEED -D'pipe(pfds)=_pipe(pfds,1024,0x8000)'/" Makefile.inc; rm Makefile.inn ;; esac # FFCS - 16/1/13 - what was "$(CCP)" used for? $(SRCDIR)/FAIT: $(SRCDIR) Makefile.inc cp Makefile.inc $(SRCDIR)/src cd $(SRCDIR)/src && $(MAKE) scotch # # 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 ; 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 -lptesmumps -lptscotch -lptscotcherr >>$(SRCDIR)/$(INSTALL)/lib/WHERE.scotch -$(TESTMPI) &&echo ptscotch INCLUDE -I@DIR@/include/scotch >> $(SRCDIR)/$(INSTALL)/lib/WHERE.scotch echo scotch LD -L@DIR@/lib -lscotch -lscotcherr >>$(SRCDIR)/$(INSTALL)/lib/WHERE.scotch echo scotch INCLUDE -I@DIR@/include/scotch >> $(SRCDIR)/$(INSTALL)/lib/WHERE.scotch $(SRCDIR): $(PACKAGE) tar xvzf $(PACKAGE) cd $(SRCDIR)/src/libscotch/; patch -p1 < ../../../scotch_5.1_esmumps.patch cd $(SRCDIR)/src/esmumps/; patch -p1 < ../../../Makefile.patch touch $(SRCDIR) # FFCS: (7/2/11) gforge.inria.fr seems to have switched from http to https $(PACKAGE): -mkdir $(DIRPKG); # FH/ 06/08/13 remove -no-check-certificate in $(WGET) command , pb this curl... cd $(DIRPKG);$(WGET) $(SERVER)/`basename $(PACKAGE)` # FFCS - 28/3/13 - more cleaning clean-local: -cd $(SRCDIR)/src && $(MAKE) realclean -C $(SRCDIR)/src -rm config.log # FH -rm $(PACKAGE) clean: clean-local -rm Makefile.inc -rm -rf $(SRCDIR) -rm FAIRE .PHONY:$(SRCDIR)/$(INSTALL) # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.26-2/download/scotch/Makefile-scotch.inc000644 000767 000767 00000001563 12212103150 021347 0ustar00hecht000000 000000 # ALH - avoid blocking when Makefile.inc is not built yet -include @abs_top_builddir@/download/headers-sparsesolver.inc EXE = LIB = .a OBJ = .o DIRMPI = @FFMPIDIR@ MAKE = make AR = @AR@ ARFLAGS = @ARFLAGS@ CAT = cat CCS = @CC@ CCP = @MPICC@ CCD = @CC@ -I'@MPI_INC_DIR@' # FFCS - 16/4/13 - some plain C files seem to need access to mpi.h too # FFCS - 23/4/13 - remove thread and fork dependency on Windows with # -DCOMMON_STUB_FORK without -DCOMMON_PTHREAD # [[file:scotch_5.1_esmumps/INSTALL.TXT::COMMON_STUB_FORK]] CFLAGS = @CFLAGS@ -I'@MPI_INC_DIR@' $(FFINTSCOTCH) -Drestrict=__restrict -DCOMMON_STUB_FORK -DCOMMON_RANDOM_FIXED_SEED -DCOMMON_TIMING_OLD -DSCOTCH_RENAME -DSCOTCH_DETERMINISTIC LDFLAGS = @LDFLAGS@ -lm @MPI_LIB@ @LIBSPTHREAD@ #-L/usr/local/lib/gcc/ CP = cp LEX = @LEX@ LN = ln MKDIR = mkdir MV = mv RANLIB = @RANLIB@ YACC = @YACC@ WGET = @WGET@ freefem++-3.26-2/download/scotch/._Makefile.patch000644 000767 000024 00000000341 11752536756 021666 0ustar00hechtstaff000000 000000 Mac OS X  2ATTRIIcom.apple.quarantineq/0001;4faa32e0;Mail;98D231E1-2F1D-4AEF-B432-E5988CF966D1|com.apple.mailfreefem++-3.26-2/download/scotch/Makefile.patch000644 000767 000767 00000001114 11752536756 020442 0ustar00hecht000000 000000 diff -ur scotch_5.1_esmumps/src/esmumps/Makefile scotch-okk/Makefile --- scotch_5.1_esmumps/src/esmumps/Makefile 2009-04-27 11:22:08.000000000 +0200 +++ scotch-okk/Makefile 2012-05-09 10:00:46.765713788 +0200 @@ -44,7 +44,7 @@ $(CC) $(CFLAGS) -I$(includedir) -c $(<) -o $(@) %$(EXE) : %.c - $(CC) $(CFLAGS) -I$(includedir) $(<) -o $(@) -L$(libdir) $(LDFLAGS) -L. -l$(ESMUMPSLIB) -l$(SCOTCHLIB) -l$(SCOTCHLIB)errexit + $(CC) $(CFLAGS) -I$(includedir) $(<) -o $(@) -L$(libdir) -L. -l$(ESMUMPSLIB) -l$(SCOTCHLIB) -l$(SCOTCHLIB)errexit $(LDFLAGS) ## ## Project rules. freefem++-3.26-2/download/scotch/scotch_5.1_esmumps.patch000644 000767 000767 00000014351 11752236270 022337 0ustar00hecht000000 000000 diff -ur scotch_5.1_esmumps/src/libscotch/Makefile scotch_5.1_esmumps-okk/Makefile --- scotch_5.1_esmumps/src/libscotch/Makefile 2009-06-06 16:05:52.000000000 +0200 +++ scotch_5.1_esmumps-okk/Makefile 2010-02-11 18:14:35.000000000 +0100 @@ -64,10 +64,9 @@ scotch.h \ scotchf.h \ libptscotch$(LIB) \ - libscotch$(LIB) \ libptscotcherr$(LIB) \ libptscotcherrexit$(LIB) - + ## libscotch$(LIB) install : -$(CP) scotch.h scotchf.h $(includedir) -$(CP) libscotch$(LIB) libscotcherr*$(LIB) $(libdir) @@ -2274,7 +2273,162 @@ vdgraph_separate_sq$(OBJ) \ vdgraph_separate_st$(OBJ) \ vdgraph_separate_zr$(OBJ) \ - vdgraph_store$(OBJ) + vdgraph_store$(OBJ) arch$(OBJ) \ + arch_build$(OBJ) \ + arch_cmplt$(OBJ) \ + arch_cmpltw$(OBJ) \ + arch_deco$(OBJ) \ + arch_hcub$(OBJ) \ + arch_mesh$(OBJ) \ + arch_tleaf$(OBJ) \ + arch_torus$(OBJ) \ + arch_vcmplt$(OBJ) \ + arch_vhcub$(OBJ) \ + bgraph$(OBJ) \ + bgraph_bipart_bd$(OBJ) \ + bgraph_bipart_df$(OBJ) \ + bgraph_bipart_ex$(OBJ) \ + bgraph_bipart_fm$(OBJ) \ + bgraph_bipart_gg$(OBJ) \ + bgraph_bipart_gp$(OBJ) \ + bgraph_bipart_ml$(OBJ) \ + bgraph_bipart_st$(OBJ) \ + bgraph_bipart_zr$(OBJ) \ + bgraph_check$(OBJ) \ + bgraph_store$(OBJ) \ + common$(OBJ) \ + common_file$(OBJ) \ + common_file_compress$(OBJ) \ + common_file_uncompress$(OBJ) \ + common_integer$(OBJ) \ + common_memory$(OBJ) \ + common_stub$(OBJ) \ + gain$(OBJ) \ + geom$(OBJ) \ + graph$(OBJ) \ + graph_base$(OBJ) \ + graph_check$(OBJ) \ + graph_coarsen$(OBJ) \ + graph_induce$(OBJ) \ + graph_io$(OBJ) \ + graph_io_chac$(OBJ) \ + graph_io_habo$(OBJ) \ + graph_io_mmkt$(OBJ) \ + graph_io_scot$(OBJ) \ + graph_list$(OBJ) \ + hall_order_hd$(OBJ) \ + hall_order_hf$(OBJ) \ + hall_order_hx$(OBJ) \ + hgraph$(OBJ) \ + hgraph_check$(OBJ) \ + hgraph_induce$(OBJ) \ + hgraph_order_bl$(OBJ) \ + hgraph_order_cp$(OBJ) \ + hgraph_order_gp$(OBJ) \ + hgraph_order_hd$(OBJ) \ + hgraph_order_hf$(OBJ) \ + hgraph_order_hx$(OBJ) \ + hgraph_order_nd$(OBJ) \ + hgraph_order_si$(OBJ) \ + hgraph_order_st$(OBJ) \ + hmesh$(OBJ) \ + hmesh_check$(OBJ) \ + hmesh_hgraph$(OBJ) \ + hmesh_induce$(OBJ) \ + hmesh_mesh$(OBJ) \ + hmesh_order_bl$(OBJ) \ + hmesh_order_cp$(OBJ) \ + hmesh_order_gr$(OBJ) \ + hmesh_order_gp$(OBJ) \ + hmesh_order_hd$(OBJ) \ + hmesh_order_hf$(OBJ) \ + hmesh_order_hx$(OBJ) \ + hmesh_order_nd$(OBJ) \ + hmesh_order_si$(OBJ) \ + hmesh_order_st$(OBJ) \ + kgraph$(OBJ) \ + kgraph_map_rb$(OBJ) \ + kgraph_map_rb_map$(OBJ) \ + kgraph_map_rb_part$(OBJ) \ + kgraph_map_st$(OBJ) \ + library_arch$(OBJ) \ + library_arch_f$(OBJ) \ + library_arch_build$(OBJ) \ + library_arch_build_f$(OBJ) \ + library_geom$(OBJ) \ + library_geom_f$(OBJ) \ + library_graph$(OBJ) \ + library_graph_f$(OBJ) \ + library_graph_base$(OBJ) \ + library_graph_base_f$(OBJ) \ + library_graph_check$(OBJ) \ + library_graph_check_f$(OBJ) \ + library_graph_io_chac$(OBJ) \ + library_graph_io_chac_f$(OBJ) \ + library_graph_io_habo$(OBJ) \ + library_graph_io_habo_f$(OBJ) \ + library_graph_io_mmkt$(OBJ) \ + library_graph_io_mmkt_f$(OBJ) \ + library_graph_io_scot$(OBJ) \ + library_graph_io_scot_f$(OBJ) \ + library_graph_map$(OBJ) \ + library_graph_map_f$(OBJ) \ + library_graph_map_view$(OBJ) \ + library_graph_map_view_f$(OBJ) \ + library_graph_order$(OBJ) \ + library_graph_order_f$(OBJ) \ + library_mesh$(OBJ) \ + library_mesh_f$(OBJ) \ + library_mesh_graph$(OBJ) \ + library_mesh_graph_f$(OBJ) \ + library_mesh_io_habo$(OBJ) \ + library_mesh_io_habo_f$(OBJ) \ + library_mesh_io_scot$(OBJ) \ + library_mesh_io_scot_f$(OBJ) \ + library_mesh_order$(OBJ) \ + library_mesh_order_f$(OBJ) \ + library_parser$(OBJ) \ + library_parser_f$(OBJ) \ + library_random$(OBJ) \ + library_random_f$(OBJ) \ + mapping$(OBJ) \ + mapping_io$(OBJ) \ + mesh$(OBJ) \ + mesh_check$(OBJ) \ + mesh_coarsen$(OBJ) \ + mesh_graph$(OBJ) \ + mesh_induce_sepa$(OBJ) \ + mesh_io$(OBJ) \ + mesh_io_habo$(OBJ) \ + mesh_io_scot$(OBJ) \ + order$(OBJ) \ + order_check$(OBJ) \ + order_io$(OBJ) \ + parser$(OBJ) \ + parser_ll$(OBJ) \ + parser_yy$(OBJ) \ + vgraph$(OBJ) \ + vgraph_check$(OBJ) \ + vgraph_separate_bd$(OBJ) \ + vgraph_separate_es$(OBJ) \ + vgraph_separate_fm$(OBJ) \ + vgraph_separate_gg$(OBJ) \ + vgraph_separate_gp$(OBJ) \ + vgraph_separate_ml$(OBJ) \ + vgraph_separate_st$(OBJ) \ + vgraph_separate_th$(OBJ) \ + vgraph_separate_vw$(OBJ) \ + vgraph_separate_zr$(OBJ) \ + vgraph_store$(OBJ) \ + vmesh$(OBJ) \ + vmesh_check$(OBJ) \ + vmesh_separate_fm$(OBJ) \ + vmesh_separate_gg$(OBJ) \ + vmesh_separate_gr$(OBJ) \ + vmesh_separate_ml$(OBJ) \ + vmesh_separate_zr$(OBJ) \ + vmesh_separate_st$(OBJ) \ + vmesh_store$(OBJ) $(AR) $(ARFLAGS) $(@) $(?) -$(RANLIB) $(@) --- scotch_5.1_esmumps/src/libscotch/common.c 2008-05-22 13:44:41 +0000 +++ scotch_5.1_esmumps-okk/common.c 2012-05-08 14:47:19 +0000 @@ -54,10 +54,25 @@ */ #define COMMON - #include #include "common.h" +#if defined(_WIN32) +#include +double +clockGet (void) +{ + time_t ltime; + struct _timeb tstruct; + + time (<ime); + _ftime(&tstruct); + double val = (double) ltime + (double) tstruct.millitm*(0.001); + return val; +} + +#else + /*******************/ /* */ /* Timing routine. */ @@ -86,7 +101,7 @@ #endif /* COMMON_TIMING_OLD */ #endif /* MPI_INT */ } - +#endif /* _WIN32 */ /***************************/ /* */ /* Usage printing routine. */ freefem++-3.26-2/download/scalapack/Makefile000644 000767 000767 00000004427 12240775536 020007 0ustar00hecht000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- include SLmake.inc all-local: scalapack # FFCS: parallel compilation crashes on Win32 (same archive updated from 2 different parallel makes) MAKEFLAGS=-j 1 # Downloading and compiling scalapack # ------------------------------ # http://www.netlib.org/scalapack/ # Hips information DIRPKG=../pkg SRCDIR=scalapack-2.0.2 PACKAGE1=$(DIRPKG)/scalapack-2.0.2.tgz SERVER=http://www.netlib.org/scalapack/ INSTALL=../.. # FFCS: shorten argument length to avoid "sh: ../ar: Argument list too long" under Cygwin DIR1 = TOOLS/LAPACK/*.o DIR2 = TOOLS/*.o DIR3 = PBLAS/SRC/PBBLAS/*.o DIR4 = PBLAS/SRC/PTZBLAS/*.o DIR5 = PBLAS/SRC/PTOOLS/*.o DIR6 = PBLAS/SRC/*.o DIR7 = REDIST/SRC/*.o DIR8 = SRC/*.o DIR9 = BLACS/SRC/*.o BLACS/SRC/*.oo scalapack: FAIRE # FFCS: shorten argument length to avoid "sh: ../ar: Argument list too long" under Cygwin $(SRCDIR)/FAIT-202:$(SRCDIR)/tag-tar cp SLmake.inc $(SRCDIR) cd $(SRCDIR);$(MAKE) lib rm $(SRCDIR)/libscalapack.a cd $(SRCDIR) && $(ARCH) $(ARCHFLAGS) libscalapack.a $(DIR1) $(DIR2) $(DIR3) $(DIR4) $(DIR5) $(DIR6) $(DIR7) $(DIR8) $(DIR9) $(RANLIB) $(SRCDIR)/libscalapack.a touch $(SRCDIR)/FAIT-202 install: mkdir -p ../include cp $(SRCDIR)/SRC/*.h ../include mkdir -p ../lib cp $(SRCDIR)/libscalapack.a ../lib WHERE: if [ -f $(SRCDIR)/FAIT-202 ] ; then \ make install; \ echo scalapack LD -L@DIR@/lib -lscalapack >../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): -mkdir $(DIRPKG) cd $(DIRPKG);$(WGET) $(SERVER)/`basename $(PACKAGE1)` 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.26-2/download/scalapack/SLmake-scalapack.inc000644 000767 000767 00000003441 12167254041 022120 0ustar00hecht000000 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.26-2/download/pastix/all_macros.diff000644 000767 000767 00000001276 12214307167 020672 0ustar00hecht000000 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.26-2/download/pastix/config-pastix-complex.in000644 000767 000767 00000015120 12240775536 022475 0ustar00hecht000000 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) VERSIONINT = $(FFVERSIONINT)#_long CCTYPES = $(FFCTYPESINT)#-DFORCE_LONG -DLONG #--------------------------- #VERSIONINT = _int32 #CCTYPES = -DFORCE_INT32 -DINTSIZE32 #--------------------------- #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.26-2/download/pastix/config-pastix-real.in000644 000767 000767 00000015121 12240775536 021752 0ustar00hecht000000 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 = _int32 #CCTYPES = -DFORCE_INT32 -DINTSIZE32 #--------------------------- #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.26-2/download/pastix/Makefile000644 000767 000767 00000022141 12240775536 017366 0ustar00hecht000000 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) 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) install #endif 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 # # 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 -C $(SRCDIR)/src #endif 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_long_complex.h) +#ifdef __cplusplus +#include +#define pastix_float_t std::complex +extern "C" { + MPI_Datatype GetMpiType() ; +#else + #include +#define pastix_float_t double complex +#endif #define pastix_int_t long #define pastix_uint_t unsigned long #define MPI_PASTIX_INT MPI_LONG -#define pastix_float_t double complex #define MPI_PASTIX_FLOAT GetMpiType() #define INT pastix_int_t #define UINT pastix_uint_t @@ -744,3 +751,6 @@ #define MTX_ISRHS(a) (a)[0]!='\0' /* **************************************** */ +#ifdef __cplusplus +} +#endif freefem++-3.26-2/download/parms/Makefile000644 000767 000767 00000003575 12240775536 017212 0ustar00hecht000000 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): -mkdir $(DIRPKG); cd $(DIRPKG);$(WGET) $(SERVER) --output-document=$(PACKAGE) 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.26-2/download/parms/makefile-parms.in000644 000767 000767 00000003377 12240775536 020777 0ustar00hecht000000 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.26-2/download/parmetis/makefile000755 000767 000767 00000006356 12212321217 017735 0ustar00hecht000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- # $Id$ 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/OLD INSTALL=../.. parmetis_VERSION=3.1.1 parmetis: WHERE.done compile.done:$(SRCDIR)/tags Makefile.in -mkdir -p "../lib/parmetis" -mkdir -p "../include/parmetis" cp Makefile.in $(SRCDIR) # FFCS - we need to know when errors occur cd $(SRCDIR)/METISLib && $(MAKE) cd $(SRCDIR)/ParMETISLib && $(MAKE) touch $@ # FFCS - simpler makefile install.done:compile.done # cp $(SRCDIR)/libparmetis.a $(SRCDIR)/$(INSTALL)/lib # cp $(SRCDIR)/libmetis.a $(SRCDIR)/$(INSTALL)/lib cp $(SRCDIR)/parmetis.h ../include/parmetis cp $(SRCDIR)/METISLib/*.h ../include/parmetis sed 's;../parmetis.h;parmetis.h;' <$(SRCDIR)/METISLib/metis.h >../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/libmetispar.a # -cd $(SRCDIR)/Programs && make touch $@ # FFCS - simpler makefile WHERE.done:install.done echo parmetis LD -L@DIR@/lib/parmetis -lparmetis -lmetispar >$(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: $(PACKAGE) tar xvzf $(PACKAGE) patch -p0 $(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): cd $(DIRPKG);$(WGET) $(SERVER)/`basename $(PACKAGE)` # 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.26-2/download/parmetis/Makefile-parmetis.in000644 000767 000767 00000001041 12167254041 022114 0ustar00hecht000000 000000 # Which compiler to use CC = @MPICC@ LD= @MPICC@ # What optimization level to use OPTFLAGS = @CFLAGS@ # 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@ freefem++-3.26-2/download/parmetis/parmetis-3.1.1.patch000644 000767 000767 00000000705 11406142255 021534 0ustar00hecht000000 000000 --- ParMetis-3.1.1/ParMETISLib/stdheaders.h 2008-09-16 23:39:19.000000000 +0200 +++ ParMetis-3.1.1/ParMETISLib/stdheaders.h-ok 2010-03-30 11:51:17.000000000 +0200 @@ -11,10 +11,16 @@ * $Id$ */ - +#ifdef HAVE_CONFIG_H +#include "config.h" +#ifdef HAVE_MALLOC_H +#include +#endif +#else +#include +#endif #include #include -#include #include #include #include freefem++-3.26-2/download/nlopt/Make.inc000644 000767 000767 00000000144 11650024051 017100 0ustar00hecht000000 000000 FFDOWNLOAD=@abs_builddir@/download CC=@CC@ CXX=@CXX@ WGET=@WGET@ CXXFLAGS=@CXXFLAGS@ CFLAGS=@CFLAGS@freefem++-3.26-2/download/nlopt/Makefile000644 000767 000767 00000002635 12167254041 017207 0ustar00hecht000000 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. # cd $(SRCDIR) && ./configure --disable-dependency-tracking --with-cxx --prefix="$(FFDOWNLOAD)" CXX="$(CXX)" \ CXXFLAGS="$(CXXFLAGS)" CC="$(CC)" CFLAGS="$(CFLAGS)" CP="$(CXXCPP)" "--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 $(TARGZ): cd ../pkg;$(WGET) $(URL) ../pkg: mkdir $@ 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.26-2/download/mumps-seq/Makefile000644 000767 000767 00000006216 12240775536 020012 0ustar00hecht000000 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=4.10.0 # ALH - this is also set in Makefile.inc, but this file may not always exist (eg after a make clean) WGET = wget --no-check-certificate # 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 -lpthread > ../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): cd `dirname $@`; $(WGET) http://graal.ens-lyon.fr/MUMPS/`basename $(PACKAGE1)` clean: -rm Makefile.inc FAIRE* *~ -rm -rf ../include/*mumps* -rm -rf ../lib/lib*mumps* ../lib/libpord*.a ../lib/libmpiseq*.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.26-2/download/mumps-seq/Makefile-mumps-4.10.0.inc000644 000767 000767 00000013334 12240775536 022436 0ustar00hecht000000 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_4.10.0/libseq LIBSEQ = -L$(DOWNLOADFF)//mumps-seq/MUMPS_4.10.0/libseq -lmpiseq$(PLAT) # DEFINE HERE YOUR BLAS LIBRARY LIBBLAS = @BLASLIBS@ # DEFINE YOUR PTHREAD LIBRARY LIBOTHERS = @LIBSPTHREAD@ @FLIBS@ $(FFLIBOTHERSMUMPS) # 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.26-2/download/mumps/Makefile000644 000767 000767 00000006340 12240775536 017222 0ustar00hecht000000 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=4.10.0 # ALH - this is also set in Makefile.inc, but this file may not always exist (eg after a make clean) WGET = wget --no-check-certificate 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 -lpthread > $@ 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 $(PACKAGE1): cd `dirname $@`; $(WGET) http://graal.ens-lyon.fr/MUMPS/`basename $(PACKAGE1)` clean:clean-local clean-local: -cd $(SRCDIR) && $(MAKE) clean -C $(SRCDIR) -rm Makefile.inc FAIRE* ../lib/WHERE.mumps -rm -rf ../include/*mumps* -rm -rf ../lib/lib*mumps* ../lib/libpord*.a ../lib/libmpiseq*.a -rm -rf $(SRCDIR) # -rm $(PACKAGE1) -rm config.log *.done # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.26-2/download/mumps/Makefile-mumps-4.10.0.inc000644 000767 000767 00000013447 12167254041 021644 0ustar00hecht000000 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 # 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) # 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@ -fno-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.26-2/download/mumps/MUMPS_4.10.0.patch000644 000767 000767 00000002116 12034030605 020257 0ustar00hecht000000 000000 Only in MUMPS_4.10.0-new/: Makefile.inc Only in MUMPS_4.10.0-new//src: fmpi.h diff -ur MUMPS_4.10.0/src/mumps_orderings.h MUMPS_4.10.0-new//src/mumps_orderings.h --- MUMPS_4.10.0/src/mumps_orderings.h 2011-05-10 12:56:41 +0000 +++ MUMPS_4.10.0-new//src/mumps_orderings.h 2012-10-06 13:15:22 +0000 @@ -68,6 +68,14 @@ int *nv, int *ncmpa, int *totw ); #endif /*PORD*/ #if defined(scotch) || defined(ptscotch) +#if defined(ptscotch) +#define SCOTCH_PTSCOTCH +#include "mpi.h" +#include +#include "ptscotch.h" +#else +#include "scotch.h" +#endif int esmumps( const int n, const int iwlen, int * const pe, const int pfree, int * const len, int * const iw, int * const nv, int * const elen, int * const last); @@ -86,9 +94,6 @@ int * const ncmpa ); #endif /*scotch or ptscotch*/ #if defined(ptscotch) -#include "mpi.h" -#include -#include "ptscotch.h" int mumps_dgraphinit( SCOTCH_Dgraph *, MPI_Fint *, MPI_Fint *); #define MUMPS_DGRAPHINIT \ F_SYMBOL(dgraphinit,DGRAPHINIT) Only in MUMPS_4.10.0-new/: tag-tar freefem++-3.26-2/download/mshmet/Makefile000755 000767 000767 00000005577 12167254041 017363 0ustar00hecht000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- # $Id$ 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) -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): -mkdir $(DIRPKG); cd $(DIRPKG);$(WGET) $(SERVER)/`basename $(PACKAGE)` 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.26-2/download/mshmet/Makefile-mshmet.inc000644 000767 000767 00000002242 11437145556 021416 0ustar00hecht000000 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) -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.26-2/download/mshmet/mshmet.2011.03.06.patch000644 000767 000767 00000004041 12131233631 021237 0ustar00hecht000000 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.26-2/download/mshmet/mshmet.2012.04.25_i586.patch000644 000767 000767 00000000517 12167254041 022030 0ustar00hecht000000 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.26-2/download/mshmet/mshmetlib-internal.h000644 000767 000767 00000000564 11437145556 021667 0ustar00hecht000000 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.26-2/download/mshmet/mshmetlib.c000644 000767 000767 00000021355 11661007736 020045 0ustar00hecht000000 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" 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.26-2/download/mshmet/mshmetlib.h000644 000767 000767 00000003604 11537661557 020060 0ustar00hecht000000 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.26-2/download/mmg3d/Makefile000644 000767 000767 00000007340 12167454462 017071 0ustar00hecht000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- # $Id$ 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) 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) $(PACKAGE): -mkdir $(DIRPKG); # FFCS - 6/11/12 - curl/MacOS8 does not like redirections cd $(DIRPKG);$(WGET) http://www.math.u-bordeaux1.fr/~cdobrzyn/logiciels/download/mmg3d4.0.tgz 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) 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 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* -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.26-2/download/mmg3d/patch-mmg3dv4.diff000644 000767 000767 00000310134 12167477612 020641 0ustar00hecht000000 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/mmg3dmain/mmg3d.c mmg3d4-new/build/sources/mmg3dmain/mmg3d.c --- mmg3d4/build/sources/mmg3dmain/mmg3d.c 2012-12-19 16:05:53.000000000 +0100 +++ mmg3d4-new/build/sources/mmg3dmain/mmg3d.c 2013-01-18 21:44:08.000000000 +0100 @@ -46,7 +46,7 @@ #include "compil.date" #include "mesh.h" #include "eigenv.h" - +#include "dataff.h" TIM_mytime MMG_ctim[TIMEMAX]; short MMG_imprim; @@ -397,6 +397,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 +434,7 @@ return(1); } - -int main(int argc,char *argv[]) { +int mainmmg3d(int argc,char *argv[],DataFF *dataff) { pMesh mesh; pSol sol; Info *info; @@ -451,7 +451,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 +479,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 +507,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 +539,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 +583,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 +690,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); @@ -706,5 +718,24 @@ if ( MMG_imprim < -4 || info->ddebug ) M_memDump(); M_free(mesh); + if(MMG_imprim && dataff ) endcod(); 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 ); 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 freefem++-3.26-2/download/metis/Makefile000644 000767 000767 00000004735 12167254041 017177 0ustar00hecht000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- # $Id$ 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://www.netlib.org/linalg/ #//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=4.0 metis: FAIRE $(SRCDIR)/FAIT: $(MAKE) install touch $(SRCDIR)/FAIT install:$(SRCDIR)/tag-compile cd $(SRCDIR)/Programs ;$(MAKE) -mkdir -p ../include/metis cp $(SRCDIR)/Lib/*.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 cp Makefile.in $(SRCDIR) -mkdir -p ../lib/metis cd $(SRCDIR)/Lib;make -cd $(SRCDIR)/Programs;make 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 # FFCS: patch is necessary for metis 4.0, but not for 4.0.3 $(SRCDIR)/tags: $(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): cd $(DIRPKG);$(WGET) $(SERVER)/`basename $(PACKAGE)` 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.26-2/download/metis/Makefile-metis.in000644 000767 000767 00000000626 11730112440 020705 0ustar00hecht000000 000000 # Which compiler to use CC = @CC@ # What optimization level to use OPTFLAGS = @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.26-2/download/metis/metis-4.0_main_return.patch000644 000767 000767 00000012076 12167254041 022600 0ustar00hecht000000 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.26-2/download/metis/patch-metis000644 000767 000767 00000000467 11406142255 017674 0ustar00hecht000000 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.26-2/download/ipopt/Makefile000755 000767 000767 00000004537 12234537412 017215 0ustar00hecht000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- # $Id$ 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 $(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)' \ 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 // 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.26-2/download/hips/hips-1.2b-rc4.patch000644 000767 000767 00000013070 12021334263 020455 0ustar00hecht000000 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): -mkdir $(DIRPKG) cd $(DIRPKG);$(WGET) $(SERVER)/`basename $(PACKAGE)` # 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.26-2/download/hips/makefile-hips.inc000755 000767 000767 00000004611 12240775536 020577 0ustar00hecht000000 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.26-2/download/hips/SRC_SPKIT_makefile000755 000767 000767 00000000743 11406142255 020536 0ustar00hecht000000 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.26-2/download/gmm/cxxflags000644 000767 000767 00000001204 12245613324 016724 0ustar00hecht000000 000000 CXX = clang++ -std=c++11 -isysroot /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk MPICXX = ac_ct_CXX = CC = clang -isysroot /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk MPICC = YACC = bison -y ac_ct_CC = clang -isysroot /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk CXXFLAGS = -m64 -fPIC -g -DBAMG_LONG_LONG -DCHECK_KN -fno-inline -fexceptions -fPIC CFLAGS = -g -m64 -fPIC -g -fPIC FCFLAGS = -g -O2 -fPIC FFMETIS_CFLAGS = WGET = wget --no-check-certificate WIN32DLLTARGET = freefem++-3.26-2/download/gmm/Makefile000644 000767 000767 00000002635 12214307167 016634 0ustar00hecht000000 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): cd $(PKGDIR); $(WGET) $(SERVER)/$(PACKAGE) 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.26-2/download/fftw/Makefile000644 000767 000767 00000037241 12245613241 017020 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # download/fftw/Makefile. Generated from Makefile.in by configure. # Copyright (C) 1994-2012 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. # Downloading and compiling extra libraries # ----------------------------------------- am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } pkgdatadir = $(datadir)/freefem++ pkgincludedir = $(includedir)/freefem++ pkglibdir = $(libdir)/freefem++ pkglibexecdir = $(libexecdir)/freefem++ 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 = i686-apple-darwin13.0.0 host_triplet = i686-apple-darwin13.0.0 subdir = download/fftw DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) mkinstalldirs = $(SHELL) $(top_srcdir)/mkinstalldirs CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = AM_V_P = $(am__v_P_$(V)) am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_$(V)) am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_$(V)) am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) 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) DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = aclocal-1.13 ADD_PACKAGE_NAME = AMTAR = $${TAR-tar} AM_DEFAULT_VERBOSITY = 1 AR = libtool ARFLAGS = -static -o ARPACKLIB = /Users/hecht/work/ff++/download/lib/libarpack.a ARPACKLIBS = /Users/hecht/work/ff++/download/lib/libarpack.a AUTOCONF = autoconf AUTOHEADER = autoheader AUTOMAKE = automake-1.13 AWK = awk BAMGPROG = bamg cvmsh2 BLASINC = BLASLIBS = -framework vecLib CC = clang -isysroot /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk CCDEPMODE = depmode=gcc3 CFLAGS = -g -m64 -fPIC -g -fPIC CFLAGSF77 = -DAdd_ CNOFLAGS = -m64 -fPIC COMPILE_OPENBLAS = CPPFLAGS = CXX = clang++ -std=c++11 -isysroot /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk CXXCPP = clang++ -std=c++11 -isysroot /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk -E CXXDEPMODE = depmode=gcc3 CXXFLAGS = -m64 -fPIC -g -DBAMG_LONG_LONG -DCHECK_KN -fno-inline -fexceptions -fPIC CYGPATH_W = echo DEFS = -DHAVE_CONFIG_H DEPDIR = .deps DOCPDF = freefem++doc.pdf DOCPS = freefem++doc.ps DOCPSGZ = freefem++doc.ps.gz DOWNLOADCOMPILE = compile-pkg DOWNLOADED_BLAS = DOWNLOADED_BLAS_BUILT_SOURCES = DOWNLOAD_ARPACK = arpack DOWNLOAD_FFTW = fftw DOWNLOAD_UMFPACK = umfpack DYLIB_SUFFIX = dylib ECHO_C = \c ECHO_N = ECHO_T = EGREP = /usr/bin/grep -E EIGENOBJ = eigenvalue.$(OBJEXT) ENABLE_FFCS = no EPSTOPDF = epstopdf EXEEXT = F77 = /usr/local/bin/gfortran FC = /usr/local/bin/gfortran FCFLAGS = -g -O2 -fPIC FFGLUTNAME = FFGLUTPROG = ffglut FFLAGS = -g -m64 -fPIC -g -fPIC FFMETIS_CFLAGS = FF_LAPACKdir = FF_MALLOC_H = FF_SECOND = second.o FF_STATIC_LIB = FF_UMFPACK_CONFIG = FLIBS = /usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.9.0/../../../libgfortran.dylib FNOFLAGS = -fPIC G2CLIB = /usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.9.0/../../../libgfortran.dylib GCCNOCYGWIN = GREP = /usr/bin/grep HISTORY = INSTALL = /usr/bin/install -c INSTALL_DATA = ${INSTALL} -m 644 INSTALL_PROGRAM = ${INSTALL} INSTALL_SCRIPT = ${INSTALL} INSTALL_STRIP_PROGRAM = $(install_sh) -c -s KERNEL_VERSION = LAPACKLIBS = LAPACK_arpack_LIB = /Users/hecht/work/ff++/download/lib/liblapack.a LDFLAGS = LEX = flex LEXLIB = LEX_OUTPUT_ROOT = lex.yy LIBC_VERSION = LIBOBJS = LIBS = -lm /usr/local/lib/gcc/x86_64-apple-darwin13.0.0/4.9.0/../../../libgfortran.dylib LIBSGLUT = -framework GLUT -framework OpenGL -framework Cocoa LIBSNOCONSOLE = LIBSPTHREAD = -lpthread LOAD_COMPILE = load_compile LOAD_TESTS = ../regtests.sh LTLIBOBJS = MAINT = MAKEINFO = makeinfo MEDITPROG = ffmedit MKDIR_P = ../.././install-sh -c -d MPICC = MPICXX = MPIF77 = MPIFC = MPIPROG = MPIRUN = MPISCRIPT = MPI_INCLUDE = MPI_INC_DIR = MPI_LIB = MPI_LIBC = MPI_LIBFC = MPI_LIB_DIRS = NO_RANGE_CHECK = OBJEXT = o OPTIM_TYPE = PACKAGE = fftw-$(FFTW_VERSION).tar.gz PACKAGE_BUGREPORT = hecht@ann.jussieu.fr PACKAGE_NAME = FreeFem++ PACKAGE_STRING = FreeFem++ 3.26-2 PACKAGE_TARNAME = freefem++ PACKAGE_URL = PACKAGE_VERSION = 3.26-2 PASTIX_HOSTARCH = PATH_SEPARATOR = : RANLIB = ranlib RANLIN = echo SCOTCH_INCLUDE = /Users/hecht/work/ff++/download/include/scotch SET_MAKE = SHELL = /bin/sh SIZEOF_INT = 4 SIZEOF_LONG = 8 SIZEOF_PTR = 8 SIZEOF_PTRINBIT = 64 SKIP_TESTS_EIGEN = SKIP_TESTS_MPI = yes STATICTOOL = STDPROG = STD_GRAPH_OBJ = STD_LDFLAGS = STD_LIBS = STRIP = TEST_FFPP = ../src/nw/FreeFem++ TEST_FFPPMPI = ../src/mpi/ff-mpirun TOOL_COMPILE_fflapack = fflapack TOOL_COMPILE_gsl = gsl TOOL_COMPILE_hips = hips TOOL_COMPILE_ipopt = ipopt TOOL_COMPILE_lapack = lapack TOOL_COMPILE_metis = metis TOOL_COMPILE_mmg3d = mmg3d TOOL_COMPILE_mshmet = mshmet TOOL_COMPILE_mumps = mumps TOOL_COMPILE_mumps_seq = mumps-seq TOOL_COMPILE_nlopt = nlopt TOOL_COMPILE_pardiso = pardiso TOOL_COMPILE_parmetis = parmetis TOOL_COMPILE_parms = parms TOOL_COMPILE_pastix = pastix TOOL_COMPILE_pipe = pipe TOOL_COMPILE_scotch = scotch TOOL_COMPILE_superlu = superlu TOOL_COMPILE_superludist = superludist TOOL_COMPILE_umfpack = umfpack TOOL_COMPILE_yams = yams TOOL_DYLIB_fflapack = fflapack.dylib TOOL_DYLIB_gsl = TOOL_DYLIB_hips = hips_FreeFem.dylib TOOL_DYLIB_ipopt = ff-Ipopt.dylib TOOL_DYLIB_lapack = lapack.dylib TOOL_DYLIB_metis = metis.dylib TOOL_DYLIB_mmg3d = mmg3d-v4.0.dylib TOOL_DYLIB_mshmet = mshmet.dylib TOOL_DYLIB_mumps = MUMPS_FreeFem.dylib MUMPS.dylib TOOL_DYLIB_mumps_seq = MUMPS_seq.dylib TOOL_DYLIB_nlopt = ff-NLopt.dylib TOOL_DYLIB_pardiso = TOOL_DYLIB_parmetis = TOOL_DYLIB_parms = parms_FreeFem.dylib TOOL_DYLIB_pastix = interfacepastix.dylib complex_pastix_FreeFem.dylib real_pastix_FreeFem.dylib TOOL_DYLIB_pipe = pipe.dylib TOOL_DYLIB_scotch = scotch.dylib TOOL_DYLIB_superlu = SuperLu.dylib TOOL_DYLIB_superludist = complex_SuperLU_DIST_FreeFem.dylib real_SuperLU_DIST_FreeFem.dylib dSuperLU_DIST.dylib TOOL_DYLIB_umfpack = UMFPACK64.dylib TOOL_DYLIB_yams = freeyams.dylib UMFPACKLIBS = -L/Users/hecht/work/ff++/download/lib -lumfpack -lcholmod -lcolamd -lamd -lsuitesparseconfig VERSION = 3.26-2 WGET = wget --no-check-certificate WIN32DLLTARGET = WINDRESOBJ = YACC = bison -y YFLAGS = abs_builddir = /Users/hecht/work/ff++/download/fftw abs_srcdir = /Users/hecht/work/ff++/download/fftw abs_top_builddir = /Users/hecht/work/ff++ abs_top_srcdir = /Users/hecht/work/ff++ ac_ct_CC = clang -isysroot /Applications/Xcode.app//Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.8.sdk ac_ct_CXX = ac_ct_F77 = ac_ct_FC = am__include = include am__leading_dot = . am__quote = am__tar = $${TAR-tar} chof - "$$tardir" am__untar = $${TAR-tar} xf - bindir = ${exec_prefix}/bin build = i686-apple-darwin13.0.0 build_alias = build_cpu = i686 build_os = darwin13.0.0 build_vendor = apple builddir = . datadir = ${datarootdir} datarootdir = ${prefix}/share docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} dvidir = ${docdir} exec_prefix = ${prefix} ff_bison = yes ff_convert = yes ff_curl = ff_dvips = yes ff_git = ff_gzip = yes ff_history = ff_latex = yes ff_libtool = yes ff_m4 = yes ff_makeindex = yes ff_patch = yes ff_pdf2ps = yes ff_pdflatex = yes ff_prefix_dir = /usr/local/lib/ff++/3.26-2 ff_unzip = ff_wget = yes host = i686-apple-darwin13.0.0 host_alias = host_cpu = i686 host_os = darwin13.0.0 host_vendor = apple htmldir = ${docdir} includedir = ${prefix}/include infodir = ${datarootdir}/info install_sh = ${SHELL} /Users/hecht/work/ff++/install-sh libdir = ${exec_prefix}/lib libexecdir = ${exec_prefix}/libexec localedir = ${datarootdir}/locale localstatedir = ${prefix}/var mandir = ${datarootdir}/man mkdir_p = $(MKDIR_P) oldincludedir = /usr/include pdfdir = ${docdir} prefix = /usr/local program_transform_name = s,x,x, psdir = ${docdir} sbindir = ${exec_prefix}/sbin sharedstatedir = ${prefix}/com srcdir = . sysconfdir = ${prefix}/etc target_alias = top_build_prefix = ../../ top_builddir = ../.. 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: $(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 .PRECIOUS: 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: $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): $(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 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 --no-check-certificate -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.26-2/download/fftw/Makefile.am000644 000767 000767 00000002252 12240775536 017421 0ustar00hecht000000 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.26-2/download/fftw/Makefile.in000644 000767 000767 00000037340 12245613203 017423 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 .PRECIOUS: 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 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.26-2/download/f2c/f2c.h-int000644 000767 000767 00000011151 11406142255 016467 0ustar00hecht000000 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.26-2/download/f2c/fort77.sed000644 000767 000767 00000017312 11406142255 016706 0ustar00hecht000000 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.26-2/download/f2c/Makefile000644 000767 000767 00000005743 12123136341 016522 0ustar00hecht000000 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.26-2/download/f2c/Makefile-MacOs000644 000767 000767 00000016566 11406142255 017533 0ustar00hecht000000 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.26-2/download/f2c/tt.f000644 000767 000767 00000000063 11406142255 015652 0ustar00hecht000000 000000 program tt print *,"dgfgdfg" end freefem++-3.26-2/download/blas/Makefile.am000644 000767 000767 00000023733 12243167606 017377 0ustar00hecht000000 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 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 # "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) -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 $(BLAS_TGZ): mkdir -p $(DIRPKG) cd $(DIRPKG) && @WGET@ -N http://www.netlib.org/blas/blas.tgz $(CBLAS_TGZ): mkdir -p $(DIRPKG) cd $(DIRPKG) && @WGET@ -N http://www.netlib.org/blas/blast-forum/cblas.tgz 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@ 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 # cd OpenBLAS && make BINARY=@SIZEOF_PTRINBIT@ CC=${CC} FC=${FC} DYNAMIC_ARCH=1 libs netlib # # RANLIB is required on Win64 to avoid "archive has no index" error when linking FreeFem+.exe # $(RANLIB) OpenBLAS/libopenblas.@FF_STATIC_LIB@ touch $@ # The OpenBLAS directory is updated during the compilation, so the patching step should not depend on the directory # date openpatches.done:opendownload.done patch -u -p1 < openblas.patches touch $@ opendownload.done: git clone https://github.com/xianyi/OpenBLAS.git touch $@ # Since some libraries (VTK, FLTK, Openblas) are quite long to compile and they do not change very often (we don't # usually change them in FFCS), they are only cleaned with specific target 'allclean'. allclean:: -rm -r *.done OpenBLAS # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.26-2/download/blas/Makefile.in000644 000767 000767 00001445437 12245613203 017411 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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 VPATH = @srcdir@ am__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 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 $(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 .PRECIOUS: 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) 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 $< .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 `$(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: $(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-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 # "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) -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 $(BLAS_TGZ): mkdir -p $(DIRPKG) cd $(DIRPKG) && @WGET@ -N http://www.netlib.org/blas/blas.tgz $(CBLAS_TGZ): mkdir -p $(DIRPKG) cd $(DIRPKG) && @WGET@ -N http://www.netlib.org/blas/blast-forum/cblas.tgz 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@ 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 # cd OpenBLAS && make BINARY=@SIZEOF_PTRINBIT@ CC=${CC} FC=${FC} DYNAMIC_ARCH=1 libs netlib # # RANLIB is required on Win64 to avoid "archive has no index" error when linking FreeFem+.exe # $(RANLIB) OpenBLAS/libopenblas.@FF_STATIC_LIB@ touch $@ # The OpenBLAS directory is updated during the compilation, so the patching step should not depend on the directory # date openpatches.done:opendownload.done patch -u -p1 < openblas.patches touch $@ opendownload.done: git clone https://github.com/xianyi/OpenBLAS.git touch $@ # Since some libraries (VTK, FLTK, Openblas) are quite long to compile and they do not change very often (we don't # usually change them in FFCS), they are only cleaned with specific target 'allclean'. allclean:: -rm -r *.done 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.26-2/download/blas/openblas.patches000644 000767 000767 00000001362 12240775536 020515 0ustar00hecht000000 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.26-2/download/blacs/BLACS.patch000644 000767 000767 00000002261 12167254041 017337 0ustar00hecht000000 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.26-2/download/blacs/BLACS_gridinit_.c-return-values.patch000644 000767 000767 00000000512 12167254041 024417 0ustar00hecht000000 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.26-2/download/blacs/Bmake-blacs.inc000644 000767 000767 00000027320 12167254041 020271 0ustar00hecht000000 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.26-2/download/blacs/Makefile000644 000767 000767 00000005322 12167254041 017133 0ustar00hecht000000 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.26-2/download/arpack/ARmake.m4000644 000767 000767 00000007563 11406142255 017261 0ustar00hecht000000 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.26-2/download/arpack/arpack-patch-lapack.tar.gz000644 000767 000767 00000002204 11406142255 022560 0ustar00hecht000000 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.26-2/download/arpack/Makefile.am000644 000767 000767 00000004173 12240775536 017720 0ustar00hecht000000 000000 # Downloading and compiling extra libraries # ----------------------------------------- all-local: $(DOWNLOAD_ARPACK) EXTRA_DIST=ARmake.m4 arpack-patch-lapack.tar.gz # 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 arpack: $(ARPACKLIB) # FFCS: need to add $(RANLIB) under mingw64 to avoid "archive has no index" error $(ARPACKLIB): ARPACK/fait 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 - 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): cd $(DIRPKG);@WGET@ -N http://www.caam.rice.edu/software/ARPACK/SRC/arpack96.tar.gz $(PATCH_TAR_GZ): cd $(DIRPKG);@WGET@ -N http://www.caam.rice.edu/software/ARPACK/SRC/patch.tar.gz clean-local: -rm -r ARPACK ../lib/libarpack.a freefem++-3.26-2/download/arpack/Makefile.in000644 000767 000767 00000041310 12245613202 017705 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 # 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 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/arpack/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu download/arpack/Makefile .PRECIOUS: 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 all-local: $(DOWNLOAD_ARPACK) arpack: $(ARPACKLIB) # FFCS: need to add $(RANLIB) under mingw64 to avoid "archive has no index" error $(ARPACKLIB): ARPACK/fait 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 - 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): cd $(DIRPKG);@WGET@ -N http://www.caam.rice.edu/software/ARPACK/SRC/arpack96.tar.gz $(PATCH_TAR_GZ): cd $(DIRPKG);@WGET@ -N http://www.caam.rice.edu/software/ARPACK/SRC/patch.tar.gz clean-local: -rm -r ARPACK ../lib/libarpack.a # 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.26-2/DOC/freefem++doc.pdf000644 000767 000767 00044220772 12240454762 016151 0ustar00hecht000000 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ڍVr6+|rmIN*r3ve HJߧD[ĂLwc@IHFÒNH Rh1EB")~ёǘdHiQTjԤ*&3!b?R̘XHjEqxmKjKk XI0 qqLlb\lrD!?:8E J)5עި@M1H10!rL P0q Na64S&U %:fM $,TX2h#_6€= DZ(rl(0#,JWI)$)%pA9 ZT+O)vg #Q"gBM ʲo` $[JTn $lI-1lxAx ˠ.e(E #H̲ ",2V<Xx#a25((-RPN *DB{/D B+#:ӏmMg6}"+z>}׾ijn֟_=UYWFwnp!G_8]1D| m@ Z!aqHڙkݴ[] !W.;k}v(%,bPWۇ۝oЋ6vy1G\xK;wyђkܷ} ɹF$q5)uY!sz״~b]s.mgFJCWk"_L9tݕbt&j멅΅[ b4[p՛q-%|WSf~$`pu 7Z̿w6ς+bh;/O$:{^{6g;*rV~EЫcߩvߵE PtP35yE*} 'ʛ]W^@\9{xrمG<4-37u[ҷ%Yrc?ÎY_? GY_7vm+H$rl h_hӴi5qm1bLJtĘ啜8,<}+4v{җCGK&p$ 4;Wt> n!(]howu;'<OE_+o_܆@F6|4*+`M.BT}=|K cL =\ h 'cfOxYNUd|,n?]CEmר endstream endobj 404 0 obj << /Type /ObjStm /N 100 /First 863 /Length 1422 /Filter /FlateDecode >> stream xڕV]S:|WvZ-tm} -WߕJ.`ӗȱ{vx>yx>ƈ#'` bYHs q# sx̏`Lla0|9/0ƐF`b#` |D5AD!w1a #sE"(^$CbB; €Qb1%n}za^cIxp`eKw#<$x2s`987`v N3OX#dYs1H qLS!b!4p"Q, *X  7f[,mva¶G|Ăc܃qП3 Ƒ4Dxpp<|ܙ 89qmP?xP p̰;/sq8!ł< @yy  (+\(xc8( O~.~ҝwt[4 ?&W[]zܭ?n"YlkY|v#os+!܅[ N/.-7SP$WU[ 5Fsney/2SdnFKiu!gӹ Eq7;ckڪ*lC"zH;e’.heZݻ\ݘ\Q:*j*]KD/9NBY5F+("Eάm5M ;u_ZUUXURR,{W޴+H^Zs8ŝ'ϔ xtŧl5J\~% nМt /VejuiaaFY> _fxgMՆ>2 /ޥ8g]<Z|2MMvJfIzFW\ۦ!xӁw5:doY3_*])mQ9]yA[\6Z4Kw!k_y.#X'Υސ2^DW )p)iءdsL<U^f:\jTyВ J4WmtonUzYNwd7 d߽E}dxZԯϽ* Z6֔ S pȽVxS\3I` sh4~DOdܴrgU䵴ږSBDO?Qgiaar\HM^5-jjw{e3 4E mک$O endstream endobj 605 0 obj << /Type /ObjStm /N 100 /First 865 /Length 1385 /Filter /FlateDecode >> stream xڝWn8}WcH(p6 PAn@_h궺$~$;MdcZ33D{y|ODڐYᓐ>!GkZ LKE ldD;Pקפ}CJ.HE _H tAHf;a%0)oB[e(yQIȨEyc01` emOm=@ a` \pCv ̾'a Q3sssp B g \xWаJaaX'2@@* ^"Tff j!^"p"B*$ʠ҃Iɱ E] gIB&D@9)9eH'A`NHÕK@>c |=3PзEϾv=uId.ʼBM t-lfo6]ki3ZY néCC_"%1\CUU6P[UsWQZ+/_N+پnҦBwnALZc-;Gw.kj7^.Ij@;AyUQ5S uSSm\(~Z.ݧf V(7WtckN?;Wo[7ᾬf^c4Zkv ]֓`YwE\GqPyilJ=Me߻ңR2Xۺs;qBSG)3p"z1zpWOhnw㓴@3]@weq<4zէ/pIW]X ,ܟϣz-Kz;EhАUwkp}fy?`[8뚧ϩ`-z(q]U٤7Źx#EBk\aPc1GY(p͐eVpgGnkp\ڳ}†3$f|LbO^UK&{N=hg|8?awSz}9qT'ClI,i}K:Lۭ2wT f!wO > stream xuQKO0 Wj44<8=Bڱt[J[2.#  ‚id8抂mdW+`gMtG_HPq椣A'E]eTYQ1DJI; +).jHR:>_]ݼ1%$M^ѹ7.'0>lʗeUxYUM&?ڟ C{"AH#r 2m,useRqG ~S@n ]ZnkF6eh>Gj?F@e,48nh-Mk?ڗAs]YmxJ hWBX[;euC/*v3>]{ҷ ژR/|j endstream endobj 860 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plots/titre-ff.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 871 0 R /BBox [0 0 226 146] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 872 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 862 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plots/ffauteur.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 873 0 R /BBox [14.99807 91.54739 155.5242 135.2476] /Resources << /ProcSet [ /PDF /Text ] /ColorSpace << /Cs1 874 0 R /Cs2 875 0 R >>/ExtGState << /Gs1 876 0 R /Gs2 877 0 R >>/Font << /F1.0 878 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 879 0 obj << /Length 883 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 880 0 obj << /Length 884 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 885 0 obj << /Length 886 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 863 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 889 0 obj << /Length 19 /Filter /FlateDecode >> stream x3PHW0Pp2Ac( endstream endobj 910 0 obj << /Length 2330 /Filter /FlateDecode >> stream xڵX[s6~Ԃq#Af_&q4I}JBb^T^x63ÃsfA/O-]E'gYH2D/ )PBX;X2\,82O?-szG삥 Hܓ`d2]xJ,ضXOmSe"v0?|, YX Ix"Moݑ506iڛyFJI( Hx9FrBD[oG&w+N)$JTHF}1Ic;1Gɉ;^ +)I2[+m˾y(dcMtV9Hȑs zֱ u]OCY33 Cg |%EŹ+./ zϛ,W\EM`*ɑ%GH@,#JGSIL_ݗor:C3sjIc;mhOTs9O yy@oh*c<*^|,VHv˕4z:,~(LN,hp.KǕRme,4Z79s%8&vkh1nQMwC 8'e75-pm6z 7LlHЙķA&|`?fb TG!a5$JɯA{/jlm6]ׄZgKFC墙.ÁZx81s 3:Cm?;Csw{ӭ VEo^yC\7.]ng)9. ε{جqJt*y4Hp$ mاLnՄ"HzP^ڶrڋeʣVy{9ƞ]sG{>{9G4`57ůu`:oЄLxpx3c|߆97Wcp#+ΖeiiMChl}]Ję%`"7vSi p/8z/#{i #۷0 9CD7Ξ}Rap>q'.<DVFKލ͈VN@,*7öD!Nf0{׬0?{cUD>o| >|fo y ;/L|7 N X81U)ɨDtDae,|R56/4AB{ \? A5 ݌oϢ0ZM=Lnpg^p}W8Yӎ;o>¨@WTp,w}r3>@ 6XcklCb 'mX89ELlL٘>)Y̽|Tȗ4`)pࣇ[nmY`uyuS5J߬xMo. N[B2%f̢-`7o 6vaI8v.+у}W|ѯuvfg'#4:QO77DvtrQp-n:p0[() w<~[ ~(E뗀_ۡӁK};5@+>bJ}/ޓ)Nu@09&I=gup_tƀs^(H  +n\sW fԡxs o1 t .JG|bAx|ry>;'S[{#G7hTK.aXj;`z_ ,B*#>ζtW8$@kWZgLZ={uV] H>a C:"c qGW endstream endobj 903 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plots/LogoLJLL.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 921 0 R /BBox [0 0 567 652] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R9 922 0 R >>/XObject << /R10 923 0 R >>>> /Length 64 /Filter /FlateDecode >> stream x+T03T0A(Uȥd^U`jfT0352000450024Pp Ca endstream endobj 923 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 925 0 obj << /Filter /FlateDecode /FunctionType 0 /Domain [ 0 1] /Range [ -1 1] /BitsPerSample 8 /Size [ 256] /Length 12 >> stream xkhD endstream endobj 904 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plots/LogoUPMC.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 926 0 R /BBox [0 0 419 210] /Resources << /ProcSet [ /PDF ] /ExtGState << /Gs2 927 0 R /Gs1 928 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 905 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 933 0 obj << /Length 65 /Filter /FlateDecode >> stream x3PHW0Ppr w3P04Գ455RIS07R0326SIQ,ӌ 2@]Ct endstream endobj 972 0 obj << /Length 1460 /Filter /FlateDecode >> stream xZMs6WHM*{8KK,6tAʱ?ҔZJ?o߾]*N4z$ '%0M(DG\fIh:>e12T?5 daL9O,68Y–1\Ym`1A<%pO}Hˢ1 f l~U\m2hn_hO@;Ibd^C4>INX_]KYGc{ׂti@_Pϴ s; Poxb˅TK;h,m4(Ɩ֞m#be:u?UNHaQvǰJnETu DYfk{V]H}FGR׵)NfBIli8㠃hSPI֏ 'U9xz8 wAP{k,>ܹ(nmV|nJÍ"c7D ap%hR.Bفbc< u78E"Sr7uxM]`CbAN[y|,O^/z,ׁGsS9Zޛjrr/ T¼9C'kle3+R-sG%g1vu^8쎭*WG[6\:;WYwp9sT[Gm7ެ\V 3&=u$2+ 9,oB%nh;]jXڮB /|>cl2Wt 6mYgKFB#܄>cvWp(k˺Mƌ£}: endstream endobj 806 0 obj << /Type /ObjStm /N 100 /First 865 /Length 2903 /Filter /FlateDecode >> stream xZ[SF~ׯؕu+ qIXdqx=#M$M }#`00c`JaܺtAX&XiłH y1x&UdcRLF-SJeA9VTr-4jh3ݿ`MƂQ 0Ym`!>2=Y[\{<7X%`!xNdH1#HкQ3d$:tD#0GT *%ZpР~2*NNpJ G #t^,j\#Rк0^0aWނI b]AO`:0I"",e ZԖIB!d:ׁ-LE/,L=4X={,arMoqChlexD7LܝTd/嬬:v0/F׭+:òM1vʣI>eh}!fԐg/[UU>.YyGPڣn;t2jnciʂS@tv*\@4J`w~q}-uĎ?sqvI/Nf/{L^ŻW/Rܲ-/%x]=_Q.ww`E[A/= bxv-9Ky.XŇ},Jzd_~_ϚEKvA8^u.hunPdjTCoYQ-\e/W;"{Cʁ̋Od k4=qBciq'HbO  5@pxs櫮NF[ v;otWF1% NdZR1ŇgwI{ňɉaJt5N%E̡T& Z#9wڡްK̖ϼ"  !l"W6nPRu ;dzk%(\` 7BM5rOYC +}4<3?n9ɏ1b||!?#[b:=q `p_=".Ba9&~𑸥f҉aMTԓ` htPBF;Q %^CكKd +̫QF)FIOèhg_ѧ>݇4j*|xҽLJKE7?7Wwݗ7-D߉òC$| tgߗyRE6SbRf~ (.1G]Ӡ7%+o/l~)W;nս@[8zS]–Z`9Nm1Ytк%6 s@` \fdO ;NF|\ݏlwLJ [N+s2pw^QUmQ[} d#tNqD{o/b1/;:C {of !? TH(&Z$.2Q$< @XcVW*t Obq?16BhṚo f!M GFED,Eֈ=(ӌ"cP~[{V# h%W5 "5i9>+psG{;4[\ۢ69hTo`oő:N {T}wS /Ft򹘖O -^F,ohtDƶ7tЮ73@Qt,nk}>7-B/[]fyC-&ިRҽ YÄWWXwmUT6UvWvV6פ6פ֤44&z&3ILg=D&z6ѳMlgtIL1tn]=D/ZG??%7s M5#:pIRxb_żC8|*NxNz>r}P?C$)~hR(@.`y42eŀAWhude(C~"kIǯNuf y#-"j͚Hl!N-䢕Yjj"PYmJÓ:SU\<T1t>eh,z-X6oA.dP$]G_i%j"IVbP0ÛW[} h`oE+ r#\4\HmCGd't$PFPk]cjg4eĂ5F7ʖ~,z9&_ yB8k|8gT߂,E#:fq{XD[FC #\=\/n.=8Fֹ[?% endstream endobj 1023 0 obj << /Length 1620 /Filter /FlateDecode >> stream x[Ks6Whr bIۉHN'aSGb.GL9ڱ)$|v]݌ѻ[GR<]1]L,}vxwxg`ՇŇT=zgN܀sv~9ӻxBpifQ58xB=_|!6>O! 7 ߥ>ne\/RYsM XeۢUx"=::?f{;iy U Ac\ۗ4~se~ b|Ncm9 Oq c"c^Wq /w@DN^ & U@{)v4M7Bqk MLt `ONJ;"Ί*_ n0H-odi(ʼnʲj4 L?`}Knͪ`uhS4yQɺ 2Kd WuF<@oṪ ¾nmh'o<!U G݇t(DȀ>׆Cq1߲O.0BH7w%E#C@3qQېY44@UD|@%ۈa[Qʢ4 r!L=bP: \ob)+*9[rRE̥ThrdII!¹8dfuSx`\تJ-T*G[֌ծ\6=_ yQa+]wH.Śۄ1"c6k?hNxzJ] XTMf]~QWƵ-O밖PbvBc 2H6'[z<$_Z7^mjљ-]3u22 1rn bm v!*8MaۋK"+5q YK%%WI/<(\-LcG嗹bu#Q/<qQyIfH 1>֗>w CaL"$j\yLXu,QM@¢6H-䐤h 6 4+=0-R<"$u1.v+Er>`3ِiſki:"qV,'J̍ܞLA Lglf/%S;Qh{t %mK]g)풣~ae{Jݩ:e6 ƻ%ݞnMި+n[At(Tr֮C|'A}M|Bp!2LUnL%Oa_$~AQ)Q!=, 3Fc>'yfa=D&f"kS5A,#]X.J='̶†wJsO`@7C0)~6~QR%Ѻ-ɁyceǪ uÄ=wLŻ٣]+FMm'Ͳ{5 ½5' :iMekaL \^NC endstream endobj 1070 0 obj << /Length 1554 /Filter /FlateDecode >> stream xZr6+4]Q!@vNttJV$5$$H=˜j&q$9+2=^ƽY/]<q hc Ѥ.xys=: ~5\LX$(4kUSvIQ/?XoBE{! 9LO-,x}lMKTq뾓(e=/8VEaVC `y۳tL,`4xujb8h׳ N:,"DT VAEpS]Z, *Qi4hfmQ~,4AM=oSU,XAıE1po~ ;t- ;\ܾܠ;PD,LKWCu:=,03x0qVhdQ@fdix[P`'`_la 2^utNg闑/*+&WtSު܋yHكCǨm@,wY]@Ηj`:]c(!G]J\ ;-2f,Vf#+X1OSϙ>-R.7=yl.+&2v99QM}`wa)" 2xfs w ob%%qo$ȖD,h'VNN$eJk8i@e10DpW 6D(Y4[Lj OҖ(lVh|mAJkɂ_ٺ[% {wer=s΁+()=~?hG Cmu_&fF: _ݽe?>uSgn){X(i[XT5j.ȣI;Vɧ941溸ӥܓJo/WUb)ߚp1f,]Gr`Y.14驱{IΚB\>KҚU,_.*Й:XSo0Q&S6A+g|Фp3gJ̇EFV ٵY1r&k|ˉG|\q7°3[*-\TyX3Hrmc|Q&]Rf+LM)H:"!.w\Kث`to<*5j oNW\/VUzIu&n;11whɪW݄ٗ+U92> stream xڵ[K1pX/  >$tEb p}4eˈshB鞞ꯋVSI<-=iגL[JʩccjqAD I8WްU.!> 3=t pKl#^W[ץHORIpU$荓h&Ij"!w#)i\ :}'C}U\˥s$q-K'Z2NݸcB'܇&bD p,X~9±O˗/ _ʫoֲ[LbL* ӳgMۇt*=mL}v`8>fxG; %(sχVd uX͈r T=`Bt>L h\EV@| 21$@L`⌜"9s̍W@| ^@,@Z|G*%xW6 xdYl2HOĊp:Rg ; vdp!8>!t? (y\ |5{q|B0qlP\ zW]^{x=Цˋ˷??W*]$|ݛRi?4Tcr} E|*Ӈru[vlZ9tlʱc{kvkv뇼~뇼~뇼~뇼~뇼~7c;:wlԹs͝)diJ)diJ)T^j^+}8b4Pgjma$7SHUVh!X+pq0|2E[.r ׼N٣FXb|bK.m D{=G(wwrf @E/ơ x~픻[М*B3s,=w7>9v D> b)doOw"uC: բhAt Oގ59:dұu X-x깳Re,tFQK-`vR{N0A:s͆i^@0E«m|T"ް%܊,ptU&X@ u d1ckn!4e%iKO箵.8KuUt۰.PcW 0*=چ(KzI;W'2yD57*VpcdcVE^Be60*3f#w cY -r,h=o[8?h0 UM'k S1"J4zuE$=Mh&lj;u! a ^w_}(/}oEs YMJ}46 6c ^/H-p;+r[F2an;lmW^_.:]P7#M.tc֞#W@)[t~kli(7DVTe|pWr*j580/g,,v+C1e۱ endstream endobj 1119 0 obj << /Length 1764 /Filter /FlateDecode >> stream xZr6+&Cx93v<,. XSG'b*z{p :z19z>|@":jT1Pc$fɛdn#N߄Ga$8\.DNE6 BY1T*0Nܳl<1`! 8"i#0 #`\Y՜e> 5!6-)ɕT~@(yp[*6ڛM]My߃a؉˄ټTp^d8FzI,JiSKSHES;,m((x?A~,qa[^]Oo>2]-bDZƌ7%QcgZ[)}~UY*iݢ'ADiגIV2+>\eəRLYeӒLdjY9|%"Y[b"MMpGpb!R?X,Mw\[|h}ԗԫ|+?[XSfTR3̓k6TjWQʽm$=+!ռWSѬ'Lk$NFYΞ1m2}rGg8 ^^-Ҫڮ%_̝2`PL 2?X.bAչ/"כ z{D⼰BhR_*aBz rYHNRZS(E=wepAYϬMƝmƮ }, 0}\t I)yѨoŞ-mؠ&䑸֩Hb05Ϊo.bΚy~jsMͺv BaJ\<{Uޑ'~YS`e-N`+ oieK$e{J˂+e. w?C;NSVU<_uiŧ>]zV}uƝ8Bi"uB/ɼZS[_rx9\Or.KeTHԈ2Ca#̑aA Ɏ[NC.^QBAZE5\R:K)mu8v^RTQqv6϶9CVrf{dYbH`0T xO*Z5߻aX00n1]ǣ_]e?'/| 8qsYNoN? endstream endobj 1165 0 obj << /Length 1521 /Filter /FlateDecode >> stream xr6&C`H&nIsAQTO_QnкbXȵVk]&+B[;a `h_r3φod=xȡZj5[#BLX# f=:TEZs&R7m!5,IU~`Ñ s=v#{q 1w(S,Rk=Eg"t~<~~u_T܏08E&$6;l䦩} )@|ȱW5 mШ VMHT3u S -Ix¾U6 ]dg5! !T>M6bboGE6&7ly~3nqĥŹq< ŋLA6Lfʊɞ  b2RbS {/A#ưű1l_kc4sY-442U.k|Ph;o h(u(ˡ?/@X{0Moh-WJUEZQ<>ZWz~W/ -hlMI))8k.\ Iǣq\iA2ɵͷC=5@jKls[ ˵HVtyX"ʼ=A~=ariMa7}N_R9Rꍑ~I}H0 u$ AONwФYkI3M蹇=R$#s+/ Zi(%Ϧ*x0i _n8dmbs%:UcvF=:Le=hSF0>[x++,^(]̧JaoC^_}7=׀ 榪Ϩ snSG6W<6X_G2A#5 ?Lpz 558? >2[t^E:.p}|wu& "s?I]8ji\0{~oNɋL,K~O̽mPfR짫_Mt_")I%qP`Tȹ.__% endstream endobj 1172 0 obj << /Length 477 /Filter /FlateDecode >> stream xՔMs0!2$)åpJ`I\mJ PNjW}+ogoɒj@iVH@9y3(kp }-߅*B&}> stream xڵ[َ}cc H.<$AgՉ9VkJh@ 7!re=] =zEJ?K (GC25;)Psthf= L48Cr3v66wNs)݌[xo'LI6#XsDIObBlPDzݥQe3% F7{y ^S@v| a1YQf\BC:}up9=p%@ӳ'O|o#ȸӇ7s|˷^?Q h^|~0#F(]b^\6v\乐ۤ&6)IMmRr'>)IO}RrL.\\\\\sbRΓr'<)3WǨ~1t- `H,Va1Mo.?~V8rbHjX6 pU4ӑ[Pl{8!urkh@S3h4z<:((j*Q1_h`5 _VL|c׾/@pSDyy qQWCR6j/P xeǂErR=P\tc kYPV 04+jPO#aY4 ؖ;>T2X̍lO【*G9p$ -K'O< 'DY4lY"0‘4!eOXɭTv!Fb;<~^EؖBeTvYVZaqx@8 "fumӌ4]9AMdlAӎvU `e4XJ/ƴ0|D1q`dObqW'lLsm0/s%v3N1QzEygƨ8\˿qȂGv} Ȃ! z++k ۗ}o ǹcøa\y$sH$sH$sH$sH$s$wwN:)뤬N:)뤬N6)ۤlM6)ۤlM6)ۤ쓲O>)쓲O>)iڜcE@6/XY"I Fc @ʊK(f}5(M0  48Z. \9E7/EidJP"BB!+U_) H! Fi y($[4ǜcu w2o̊q#(ƔTck/K*F;vY1AcsYu4kq2D!)&VwY14B2<'ĶbjG3YZؚJul]e芁 ` \CKOd QjE:J\F*s|iR"EUg|Y,W-}2N@Y/k- sDH[[MfYGQ<6ADh<ɹnmF&RDŽo1 Ēyt>5ΆTVP8{N!X ޾D {+#߿zs|x|.0Epy>ȗV#ANG!xv<{-~,7?Q 2C_[߀q˝gBD1o8Ȼ1L-z[B)7= mt7d-h#/P<'R,V3|yk=xg!^c&u}mOۆPsh< ˻믯]j~[U^}v.].<߀eo2-dPJu wxA%:iFFu "W6No-nำܘ؇ endstream endobj 1178 0 obj << /Length 1296 /Filter /FlateDecode >> stream xڝVKs6WHM,mm3NSLB|@bߋ88q*wmIU)>(HTukGQw>VŁLDI-<#AӯWQEAK"-]Z"TDrܑ{)P/|ΎLtZj< 뎌8ya!n"vNo "wV7Rdo~lARP[IAL<ʨ.< V@1mW5((viI>u:4uoEVNuޒc5g۸AKkxѨ4Vň:=!Ң6_ `nݑW{X,pz9)eQ<@A8*ܸm>}>+g~*sF*PODBxe"2 9'bZ6oCFۅF Z! 4s#]Bhjfըx)Zň GD 2=zn0˃5K:̒34;gδj%.,jdu\9)ѡ֏XH mwzJy]!J(dǽ KT>K)R 7XQVosc[*|ruEyObl Ǝ&hsND_@Dy~P숤%Wo8N {rLo'mӻ# 'hO-)[7{eDz,cEBvoeK_ysB"ȍnt2.2!|94``9a/}XٱW;P$ L 5sb|P-]:UzVQ|zIRF9=J:] endstream endobj 1175 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./plots/sanskrit.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1181 0 R /BBox [0 0 842 595] /Resources << /ProcSet [ /PDF /ImageB ] /ExtGState << /R7 1182 0 R >>/XObject << /R8 1183 0 R >>>> /Length 67 /Filter /FlateDecode >> stream x+T03T0A(˥d^eU1013Qе013 @@ B%+W endstream endobj 1183 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 1186 0 obj << /Length 93 /Filter /FlateDecode >> stream x3PHW0Ppr w3P04Գ455RIS07R0326SIQ(Ԍ 30@Vhb`T4//$j<: endstream endobj 1192 0 obj << /Length 2008 /Filter /FlateDecode >> stream xڽXK-xSc8$v"{Iώ}$ޥhsDD7o|daQqS$]<ԛ_oNhx8/ L{}'A.h{cMxpn9~MV_ŬzeVev,y2IXW_WE;6zǑ|"{ۈgdO-^y)j>~ ~2q z ,N"o\4N綥(aDµ'=X(_Թ}Vi_Y}/2@ @.=aErVErpvprgK&{DddlvՓ3L-5-Fܣ%{Ob9) "|% '$s+c? YO k(0>DG1?Qu*kuշ^@ZKƖCl dP]+E]ΌJ6ʩF/^?eipx+#4Yx='qWr]iI|.&N8-$ٕaefnrԩ'f{⅄sHP=~ėL_Geq!vĝ(]̶6pu^*4. 5 ve!AFqKEijO(<5Qۻ݂,l=uq)AqZ[rˏ񩵭sbAKO/E]" o&]^+ pB͓ $Ҳ +fD&g-UNRz a]U5}Qۑ3RMy,ZѾQ=Ev11if;wn畇+G? p#T[kaծ7'0owRiUw2$76OV;ԭЖԎٙW+;-Μz]I8?p;7N%]$s9z|{esC:RK-ӝQ*u "ϣ%W6Gp=n6}|6ADQ)._،'Z$i( ͑7@- 7ʠRm+h}B<o{}ʰhYLMqL$*je]Ty;ł; Opy?}rApe;^2rbFxJ_"?7V7jˆ@>JM/}!>2&:+ֳx/sxŨ_sq fXN}(@qD/)~]nDq<Û| endstream endobj 1200 0 obj << /Length 2081 /Filter /FlateDecode >> stream xڽXKs6Wm9e )ZƲUҸ6UI3IpRo7B'N'F fY0{ի gEf0Jgj] +,9LVo(L=Yz?a}OQЫ<˛4<ȏ&N_Bm5L չb͍0Uy/U z,V;1sj?2I%= ,X56Z5QgD;aDHUa || SB܈kgsS(Y7C[-鈟_4DPI$ Nn8HZmz)$mtcmJqbJ~~T.&`ǎbJNCicU9%zZpZ8XgI1`G[n8(]˩ȏlR0(\$913R3 ޷+7QGxxz3a"O88r*!7Rs+Ӧ{)K$#~[?6/fg.g؈Wzl^^N6sG)'i' 5s ޶vU`c ǡdE7I 喗hO4*'khт{Om<~ }[芦5 ZL枼N۶V{{pH^NL2?sId d0nf'.kn긴neiٔQY-!6.]7ni柜l46j+qBeizٛ(p#zlUa^~=W`]i}(6[Y &A/OV G;*O#̵bЌW9-d7 cӭD;\F/kZN>_ =q,ivpӿ+YP]I|-6Lf7WCԨ endstream endobj 1209 0 obj << /Length 2671 /Filter /FlateDecode >> stream xڵY۸XsEQc ػ^R$q/~PdZ-$9;w$9oF~.~yխ Å":ZiHLD*Y֋RHqL\, n^_/MO)$[! < ګLO/e z\FYp.Qh+ýA$vA\pp[]{Mcm5:ҭ)=^PUSZ`R!FzKGR"v*U|QT=7ox.EY&(skv?{| |ū5@DYt0 &AQwGд^)a' hMhkX"i{.`:d'C:y9Ec4|`fbK}EzQo@8Q%6f:, 4hV߃䁂u՚oG>O\8U9cכL}oLm`xY 6UG-&@ϚFg ms;BTs&wwC/P=*ja+Q8:L珮P&'#)kZLk^#-<ݦ9l4)p+JOi 44P>*AݨrĹGzk}JfRADH"S$Ó=sB3 LccL2ezc d8͙4lIyzK@@wV3'8ā0Y>Tvr=֨}@}ΉMn[nG,AnebǖR Nx\Dܢz"kvAu**RD|NPI? ɞ(F 0 (wȃ7q:HCS!+sꘇ-ʞYg$#&lfPȈ'q M|N9H-੻J,)nO'aMqO3)j=5~0"O]ɤC {:D%$o,NIc[a>sMd}iUo,âkm.{ľm?URxS ;఍ЖclQ֪ql[0UBdB2B[ ܠDG똦];clună7| ܱr9+K~Y6dW[Z Ӿڞ+ ߥ2*I0 bOq AEhks*)*4Y 512 ʃx's+ZG}\y!'t:[Y  ?ؽGu //7 iX9kdpojlaZ2ۢ |)P2LUiDu1%tNuleoN:bG 8QsC_;ԯi?_6Ҳ/pSjԤ AyAd^grLB = ?^[m[{-~by9xvh{1-:@ D1*l֎B_`jf|De+*8vq j!~:F0_| Uϲp+ N#wR 9}Qծ(zo=` «/V endstream endobj 1219 0 obj << /Length 1920 /Filter /FlateDecode >> stream xX[6~ϯ[l%!K'INg>h 6l~}t//9wn.v x5S H,%_/Xu˿ֿ"Jǫx 6.~x1{oޯ?.y}x͇fgԝVrsE_g)Hl\yY~kRFQq>^~u-b$V=3*f0y&86.s d^qCkH&lyvgJb=8y9ATFa2`w_Vlm'U[m+8;Bn??.cRq2p'_Fo:|LiH#Ԛm nf|u$zFg*W?H: *&~)/ɛt#r{W5w]HѷY%ȏ ԥ |-UQT1/wNjeb+2cg5YZH*[G'&qC "B!. 燔z_nQz -falo;Q# ) %u  yv@ޜ1OH_ 1, B`D ?3'ƔD'w|۷sIIS6gCp~ǫ]m& T6sMkuNդ;0mSdrؤs|5MpUm.ݣ|g9ݺ9I.@ـF84->gR=PyZjgׁw%1% fͫ-;]f v03}4o0umj4-H0oՇo(%{N%=R 8ۃ.*l!5 >*'vH?J_p 8'˧W*3Cbk7M^RuC/J&ZO뇒3Bݜh.[)7[Ȧ.{z.Bz~S\P$;#Jq@N%}*[.S(dROO@˙! jK)^ualP] ]׳m#XFbllvIUMEs;U8uY]V'͇O5ӆӤ3ѐS,ݷIW[vjJL -񙂐^͞rݷٙU<) M! Ȩ4xأzDhڂ)U=36.?b,ebZ =oŝb<"gӣiݪm-/v-ItKr0jusKOZ/^h0$2l[]hbBwz3ۙ\ǿ6=~ǦZah`qr?K2 [m@pi{%13Ep0Hg^bpmy?K(0/pcÃ> stream xXIs7WX94K&hT9є"$搤R"{ Ӌ(^Ւ /`/v {͏7ܶ~8 #&^bqjܺXuuY=o.>]~ȄC*YEp۰΂,#׮k'd5#q fG0'-XV)\6+\Ҧcd WJY! gy3=־m[y>'mQ)#CW$bVNh֋{Znf 's FcٸZcJN!(QVjI1 ږɡff+ |c,uvG@_#TS㮣$o#wjH4:&y\#}yfm wss8Lp^*uYEA3ўxI97b+~rB)csӚw]w"qRm]Oj4 %ʳ0qޔXMU+.-d $KI\,n L4<EcLҁ8xԔ.[(He$VI1$V>+cVbs}h-<1g~AZR, ֥6GCtvOd^eq@2] %č7/.8'b>DFeB:罀AW/BͭqmWmJU ֯!᪶?@CfC$^8}D/=#myicr]˙5Q]:cS]#E.s[@bTjV b2\ٝH:=MZd! IBLrBD}@P| ~YMV =p];0/I2ea 84{Ыh=\&Q3NH)]i0ΨF-CǂHVOpTjgPP O( }]ޝk(HuHU`-Bĝg֧͗Shl"?.""iWaO 0)Wڹ&s}y_.S;1- o_Epٳ')Z?c,V3e|y-K\-ϊ>5AsFF6,g'㡤H*e>i3X{&Cy" 4BWiRv",/ȝU5@!w̳7n)~[A}ܿ6p R2h@5cR'D+ yLd >OWg XO7?-h'>=5Eh^w _Cr|GEB1`h#5q,]22م/:eǢ|8v:5zdUO>1T|QKqp<-6uߵ3fNnv_v&1h 'bxm L@G8V&< +.iOjiU% *cy)UJzH]Nyvx(7.MBu$iLCGC4HvV\DcsJ L77$E|5(Y}%flx5ݕ#sft7`IY֏n,T;U@F!PsU1e]9V6-*ҬH&ݶmm/͕sJI7Fk`Bn㶹rQd 3Oq^R_xn?l N endstream endobj 1247 0 obj << /Length 2237 /Filter /FlateDecode >> stream xڝXmoܸ_0VrEPR]۹w]q)PZl!ZI;!ZIpg.n?g+/8gIzmEb-p?$\/M͏^~Z|O8-W^|u}nt+ ߘC3&R=(חLߴ".OQph,/TEN_9*D99MSPH/TZ _z cn7O($lEAZ'MjB#˲ƵEuKCZs2ТEaӻSv[:%r520q.mNvoiH?:GؾY(ށ1)rL,՜qpL&^qnؔEB֫+rQ0 > X07:pta$2螋8A]}vypoUNNt$nx,V(1Gk]GV.X\fs>uhu+AȢmؑ€y+y^߳QY8zN]V2ɦW'Vi4~"?\$r#bzSY0նn}ݪ\JU*Y':eבOD!L,$,;Le 0]+4zUuFp:?oGcOX$ 礬S4J*fCC|}2O3efoauTgy;CDp΁=,q|?6XQBmvQ&⇾\!ݼwW=l^aәe^MUj4QJ/UGM|annSjLn5Y4x fIRsnZ0'7w`s8gm}" ͘zR9c얓c0,Y:1q3M=L̀L.,ٛFafZlf<0΄5tc0~QL9N }{C U }" df*I7֤amTէ}G1F)X5XVܵPlȼLN`iI( RAA2/Ñ" ӓ, xq<DO %B vx;e-BQVp udpjcʱJ૮=-A NدfmE :qcCHL0jq=pM0DH7{kmB]Ȁfm' --Fv;i{‚< k׹+nj ?ѭFQ9 RBӆ3:w@~(鐐$ԕ$ /SxLxZl]_~ Ո~`߆0A;cԷM}9_\ יf >*1P^ޘ#:m!eѹS{K\zܲ*yZ+cs*w|zP!JNH?*} \w{3}1,u\)jxGrr˞PP"OjE&|zXqeap MT>h-ӺB<延&G $h?!uF{bV Ήu&;>)oɉ.IF_fihpbā׭y#tDpz+M?>{$7WFɟeJ#1曇[`_G98M3fbgH ~V?]4 8Ƈ Di)QY~/gq[z endstream endobj 1256 0 obj << /Length 719 /Filter /FlateDecode >> stream x}TMo0 W ,[v풵bkDM #f,;`AH>h(<^Β1F28Z ÑR…F5$f6~xXp~<TR1I%ÇbDjŸR88/ iBNӑv*I*Df߮Kn,;'}«/9s!USΛXLA&co "˦ |.p/cb׻2YZp( +o J7\h#"8Jh]0`#4pM:t:z OE bA Q^}؍)CKn77! +~ΆmN|:-Fu P30Uf!Hfd O]*/N7M{(ܝrCep8DSV,3_1 ]O+|#o|B&Ad$qQxAf #*S]M үìk=8T{— Uk-m즆<䩨R:t[pd?S"㜅J KN ?RJo endstream endobj 1252 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/crimpson.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1260 0 R /BBox [0 0 709 699] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 1261 0 R >>/XObject << /R8 1262 0 R >>>> /Length 57 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`n`i 41Cc#2 |@ ^ endstream endobj 1262 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ڝWK6 ﯘAbEO?Sd-ФM&@qfKJ=v"`DERGnn6tųKl#R|obӄpmv QzP/~޽~ FaW_޽EAԟ2QAb"?cv x}p8CUIЛv3yg&r)nIۺQv[%?ߪ$I"6$&? 8a4VA,SN- Z}3{n*`DQP0A$I;Ț`Y۽8 Xaݶb&Kz/[c.M  kp5eJYљkUjTg#ETrG$r9 SgȩLOϽlqiJu,XI:7"ڰԫQ'IDG$ń*aM%hTAwktN`cwhƿq 0->VTaopJd>M^Y9k$M):}%)aw)@ҝ#L a^.v6,h#iD96Yu3aWSB$,Ϯt~p ^T0$bSk0I8% #g 7um8ÚFvonZݛ#wOEIV kw+fdZ9N2b˚X9 FC8@g`XeR\qfa xA[Bl7`## is)_$ ^m9ʚt#M >u23~UԺtV 7kB@c9?x?KCqt0X66adۦZ-.i//B)55q gaa}&/Qy0b&ձxN BDA β͋ƭ =z9`a)Q"ENn,E56Rwޢ5g])SF]hpCX_IVl߃f!t;dhO0a7SJR$1I֬ FϠ{XS$W`Y[t:!|Y™kꆖw]"NsA)Q 1'ǩ}@Mo%;I}Tn .SxG `n$e^:α_e{ ;"]hժ12~9ˈsC tCa endstream endobj 1253 0 obj << /Type /XObject /Subtype /Image /Width 805 /Height 817 /BitsPerComponent 8 /Length 223059 /ColorSpace /DeviceRGB /Filter /DCTDecode >> 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 1276 0 obj << /Length 1405 /Filter /FlateDecode >> stream xڝWr6}Wh<xg|]^9>~}219QmaN؝1Dam㇙o./:/ŵ[ Lp?(81"qw\޴JK?H) 8NPnźu+5&tח>LP~;}իBȓV͢pJ x ,aRԋ0M;4%}!x^AssP\le46Jlc|2[I:q`^Zݖp'3T!CxcW[䀪Zæ^ ݽXRYzCϒ$INE?PSk<{ !xu؁̯íS5KQscdۍgS;BB', phK!z Z<d[KQxQR V"@RA $!Ҩ{Whn1^<T0٧KɷF!zeB(ռaԅ9{IWP?E  rC1`0vF1x8 ]'IAw+i%wUE֥wKƍ nm7t೩oaNl Q2ܭl7ƎeprB_x ܰ/>Llgfii!$Da0::w)nUZu]"= 6Aq3#bLiti%h7//t' ǖff`G>`oXC@b` "D n8t7@; %lQ^ Q4#/Qn"3蜘$ :]jldQ945[l$WA*EΝv[=ezЪp6;D՝ endstream endobj 1282 0 obj << /Length 1865 /Filter /FlateDecode >> stream xڭXKs6WԡKɩͣM'{uzpr%HĘ )Ya2MX,OEՏE",T.VE.yY2>oEla$ B\/~n2Y eͻk/zs]Ewĥ,8WځD ?QCm[[M2ap1c_ivL w[Llw/_9P=ɋM't_ 4|m{" QNZyDlmk5/`)vM˛oZ#YVOS͹dd)׏miv1#sB-sPLX hEP;{J0Z@ ɂ/O X2-.X]1NR8>_z6^P§E!=QLѽ#>FiwVURME5\ D`ɤЗ'Bft5PeDPAiICÄo lVt{O&R 88ˁFjZ}4H3Ic#q <Y(aȁi<2sbS愈<R2)#($C%>*)c,(jD@ވ8RsPjN'.pAYg x =('A]=#I^ClU/ϼ$‹p ](%㺐X )WHx!ohKGJ|$Py$9ڣpq$!:޶Yc'S*C)(\s}дQ<˃5}?Zvi9KbIO VXWSr : wSS(gYBN(,t䤤'v!=oM5 w1ȹr]ύr "/E1>>-g>\” vojO (pu$[.58+ʬdЩF-qG#׬RοC5 AY>ZKu琢javp媢d! 5[e12PY` @f"*Xϯo*$ Vy\H'\{ޗ ,~⢈ O7ƍ?̈nEq"f29?L'-!e\unȳڴ4$J'2IӀ ȷ4~gJ3 S􉓀aAbƑA?Mߊ(_‰{3~F/-`b|kϳҧcS#,wn!2NWW endstream endobj 1294 0 obj << /Length 1881 /Filter /FlateDecode >> stream xYrF+p \ı!ۺ>P"(!! -R,"G"`Oo3'7 NތprtvEB9RZr(H&&WUc,Oʌ o.7^}=Yʝ]je#j_v94-a!i1oz=soM'K&,Vcc eS5嘪λi *Œ;΍u_gb.+#hUοXye!q=YVcӲrS dX65!|L\%Xذ4G4J7qS|ɗqY^[u! e D,=¼)HݿgD!hV!mH>b—A QZĜHJvJl)cpT{`ك-o{6 QdT"E}ue:1H q4+x$^2"Td>r1rz="|+DZlQ=tzJ`+Eqlh!c T8c<]. _mڈxn4{f:)ňҝ-{2<BEST>m_\3Zn!$pW&ʕ{Tl6p2?,A\!IZ|E$R4  #́.;YOlz0Ȍ"AAH6vpJsR)HRW"CAUA,tRΥ瑅!j&ڨz1 'S!J'wNta]3̓m .T6g¤ FCTsY,k)YO5ǓdMbIJhѽ!t]D+RBcsO\`1m {z&nkk.Mݰ- $iԭSwy˙:N7%:N{>) @ {8/:M_yE'yp$`S8ӫbPĩ<֍kvZ|szsxA~j\wsOGꆫH^վɶB#/a!oW˽=:?6 ܻ@;JcͰ#1{}!Bpgw&鴑ska5;5ඐ$ +ixM ac5zlnMPTXp6ycD}][VrS;^@޹A a:r$0R4GAd~\<.R`в\l΋eH'a9)4ڲ?ZڐRRhB%G0S%zf]xqv %pԷF$ktg=nUF & ʒptm!^X{c"žZ8h_Y ;syGÑi{(6|j7#M(}쳗u;$:ݛF3Ci!=; DGlVi}z 2$pPf<; U4@_ʝlƜƳ3( 1@X1F7[Gea} N+&'bPX˧qqa-_H z6{ t.9:u+^74Pf[ũq3VӍ}pm5P23r endstream endobj 1289 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 340.999 327.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1303 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥khO endstream endobj 1288 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/firstTh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1304 0 R /BBox [0 0 341 328] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1305 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 1291 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 340.999 327.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1306 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥khO endstream endobj 1290 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/firstU.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1307 0 R /BBox [0 0 341 328] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1308 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 1174 0 obj << /Type /ObjStm /N 100 /First 971 /Length 2285 /Filter /FlateDecode >> stream xZko_oa F{6E^'jXG֪h;;r hPBk(L0,$ZufA *=AZ9in I$GhQ"E62l(1ME)ZH ]Xb)F ^{?&tS1!l,aT`J c04nՑ_HmcN)nDQNa(&jtoRvX+a5Y%#,wBHy_A’550ynLlnYRd+(CCHA8,Ks yڍU±2)NMqIA^%>(GhH!Zˈ d$ Sqr"kQ\>Dq.?3i/PQ_/--~ i (mqFR c9/nJu;<_\|B5fE?eƚDIb4 T+lŅ|gɨw]]Q\_CX \u̗jkCf^9]y=<7HAQ_u'0#znzD^\_GjڛǕ@4]y*+i. 3 FGkcv:ä_X]^WzPvNzL*(E'-E9}4 /.ѯ56q㏴<~ ;Їo;/Ņ˟RWےƲ_K_ Xx͑¡w[ ^,'yq^ 7 5E0߾lUD$qpa>*K*Z\=@/) T[PPSO'Uv?/ЯKn;{霏zAV`*lۦU2Ln:3Xu:\0ƨr> stream x[_s6ϧID sצvNk5}`$bK*)qo.vI-Q{&.bvAy7z2I)bhz5 (#|3G?:qPy^L=FqT/۳XIht7,O=xz9c6$F߾B"6t>4"gƛ=lidc3ϗItA״k뙽PLܗ_K~]^IqYˠï E+:RV2vٙhm I$C+R橖u~w8Iz$;N2?N04z{%}`KLHJ{M*]n.6u2[,ɲja ~˝ߵ YjI$S]Hz/PMgEk]8//c[%5m/pPR Ϗ}&eE蒬XoS;ii'%knڤ*Z6i*;楳6ruW$n+/bNDD@8 G={3S܀nlNUwPa䎯1ۯQ|Mrjl;_uu>o9\ fߨf9g~XhP‡ ~{1|{vq, xN:$Q4wm9{> }A}#wRA4}O9NNƙރ (m*g)4mJ*)ON݉|ԩPWRx4O8;Y'f/x@82|V8QУ8jqs* _^/p,*47o}ja𔟺G#!5# /"-5ժ:񰎄ИTU6K T,Xe%Շ.cß|B[]^P5ja)Dx` qS!wclwG" mJ̑~c)Lpc&]TId` l(!jُ2nlov /F&X!i NAVԔB#ͦO Z~ot)1ȃ[l'0T PH4lg'?'et ks3͓1`wZ,i BӞ~F*Ooz p(caalOB*F$~'f 9a#Z-DQf#<3Q8"ՃٞP4y!MۂmkӪb5E/Gtj{mL_GL_3}g]A!qΖ_AxB=B$\KA!E!(q1 R7o!"a ]𨅥֔ї7c[t>wt>ueR(p}nGJ6p.ϭùENNЪS= gm_3l Hw*%`i^,-mo<`㍖AzkpI)IkDkU.y]El'O;5ц_`.AqywFZzAc?bNG^flN4w(upo ]o$/~keH71$ O$QWG},י'%̈́x\} Rx{jp6y{;6gM7 cSk]UV q ;!|OtaqSnoGwi7ܙʼv.`@4זid;XpI|S&}^gFQNNzS^I<+ez;ނZcKSʋ9H9aA;:ӲNGsO6`0[--u;`qx0xXÎo@e.\6 ЭA*֧ ; Yvrc~'~5h(jt}Yx^e )?0Q'liؤ*,*nP-3+0ǧE2%NQ$t9QcNLRA+~ @8Qy mM=(8gRꁎ<ŏ!YC#tsG1h ?t6Yf=ŧ/gi1+4IV-/aO{^З;l{Ѳ=[dAikC+5xSZCy>ag*Y.w"9~`©@zge ?t.ׁ`nhN=B;6YCy>'[wb'|t?׷oƧbzMLQQ>x\t:W)>@˷uAl.y-DJiBA/9 5mh CLÝ` ¾6ٸ@@1 ;63mՠM-A|ʧ PNN9A&D4+ 9=k75}Az-۹%qX c:D>0uve ~ tđ'<{/Ԯt|~z  Uɇ <G;9M]#0<-F'e2TVBr))RS/17隔e$Ґ7Tw5M= 6[@GtC[F\K:K7[:~uU]_jf3vd3e:*RĶ\UE^LR endstream endobj 1327 0 obj << /Length 3814 /Filter /FlateDecode >> stream x[m_!䓮91|'i@ =XKҮZw侊k.9;g i:7~W#R|v)n elfKг9W? QfÛo U$k䲐*4(qI4^旇ܥMR绬۬*( #c*IMmE/lj>ŲRX[Dr;$ J|{Z^7\-e~]_hB {K P$'' $cEA*"uaQ5_o!Bj/vLcA`PZ >~t.Wdoqƈ*mnMUⳳBO΢{g V]Rʲ9x5v=:yTJMin|xeu{s@t[7M!5^#9K7[ ʈwulmmz ~d N} <}x_j7)1&.m=.qY 3x(]f"{)n<37eHb~O† *QN%v(/I&G͝ "{4ʲW/c H%yT:pe/]ф$8DR\V>6"zac*ީop/W#e3 )yXA=NXC@$IAJ`hx"dprfaM!"*' <tЪJW9Xeuos" %[h03v=2xs4"dv슨5%DdhKU8@_;03`b(qZb:ZH ˢx/S\󩪸 [:wHE ? ۄ}xζr޻As>!^qPmpVAԝo>2o-bv;N=L>nEI =Ll~ނ] -yUIK Yϋ/kZlU  ,8@0,Zkʛ5+~1G4|_`6Ջ;p"y~ O0^B>^8-D t7, "xr>&Fñ>&ZBͿ-U,]WFh{@m-,?/˪1vP2"1O/b@G<͓wL pXUk'M #0[bauߋ )fFWt%PEd- Pe1IQ\!3oH۶E1`:dAu-bXBypjɜ 5fPx%Dptظ@is&o:+luB8o]oOPοE1.,q,%ҙpNJ;vUa2':!wmdu̩Lx_RPbʹHZPeW-pɗH>&`f0N0݅OC96-*N;ÙE$].S9cd/k?omC yv a>k/k,3\>p.NJq4~]P =.]Z'u6G Wqf"0:p)`~5f`o3pM8a6Lʛ6j3|ާ>ϖ]^޹.U=8 5c]]2N3D-MiŒ?Ha ʯj7,akzփ`;A] R"0F9 Z}"F6: fEBz2P>ï%{sZ ]qbs` l ,9#%'Hy\RcѰ)Na1jU"}h 9cAB.;V{_c .$eC[E(>ȚE N~>u+6q[sO~NU SDO,UY2Ha$hD@ה㰁D`YMLvSC|հ&}~˶(rʿb8*0g%YwE}AD;G`Jhgdi2J = ʍ=J֧CWV7iXL`mͤ_ϮB}geU҉{ )4]. ULOn,we5]@ e,x2]e:õhmٶ |}ay͟lhHVxj'}yx#F / Y' S;A/|kEt҄WO8䳂0;9Wz-0]?v,W@^{ d`雛hܡGjoic^l]{K7>J~-=s&ݞʚ-/n;sJ}+hՊ/lHH⪤`hj&r*NۦɴK߇OzzXcHHl VUkΡuC+e kEtb4m \*:m-"p}7S+4nĐ)wu 3I\L:X_[ψ<O?-GX)9"k'R`xwZhkw:pA'+' T|BA4h~Nk 4&s:֥ zXPSb`VA(\&n{d'nCvDzF]?:QX}BLĺFsE Vj4JQC\6N˜xHgՋpxSsfAԕGM2bC+MJ֪b@-'% QJ&>{i<0t1:&'wua%BBw? YO h>TkY'!6q+{, #0<(Q{|<"fb*`_eKsm>wmc. _g&}Ddǿ! bѿ endstream endobj 1342 0 obj << /Length 1599 /Filter /FlateDecode >> stream xYsF_ 徸ŵ3NT,1E a$Icٯ ;K;7gk8;:2 e‰ɟѯ@qJ$fWh:x 'uoQ͍=}5ԍWj4itF`3,g/;UxzMsU ^L:0eƼt+Uciqk]pbDCѸ&Zڱg"< jL6jf> _+zSƛޔnqo]V`$a& DSJBZbk$w:Tﰏ3u_<Rx|zb0z 2# 44ΣA(%&xeEboZznRW}L,|[nev?rƼ\ZZq}'DEHH Nֳ9I$Iߝ2-^L3VymR/\JD~؉1 ,d G8˫A,,ϩwUYn2ӉG%ikb*IjΩ8 $$"{8#VcA ZߨDe+uTvצ ybM1ȰX jET%(UU tc?L>Z Ʊᡒ@cI A]+ 9,GarzF`7<;铥Ky){}Q|y1(ۋINvnTHǮmOP>C8)*%kTXnqz")* kծ|H! (kIO}ЭVT1" #LfK} tጪ߰B *bUZ$+e#2'aLvQh,q?Yrzܹ:bjhQ|\4G`ro[UGc!a0lt98$/VNJ֟)qC-|w؉6ta#[Tax,? ut[]:.O?ϔX=:=^:E N*S ܫvUQscxrHt{<(< U aW=֛*!lZ13.K1F@zRPкMQƷ= ps$,z{E' 8-3ۇx: .M endstream endobj 1322 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/secondT.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1345 0 R /BBox [0 0 287 304] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1346 0 R >>/Font << /R10 1347 0 R/R8 1348 0 R>> >> /Length 1212 /Filter /FlateDecode >> stream xWˮ7 Whޅ*RJݤ4)p/.=0lr(n%}/o߅mXsC揅PtdC0SMηIpr-}dh%P7)>[fI2RXM:q1#L:<<#>7=Dy[w};1F ḰߜS疝|Q3Ћ3t[1}<= ݚEut(10I(Rk) H6-4]{B{<>n`pV {c^ioq H=S ȏ4\&䓺bXp+jΡH ޶3@wk@s9va4 CC.8D1c RO.q憊Qpۆq@DLCoZUSZ.8t ǵ7>ueJx__mF_hi(wZA}DڏW dTuvؘ.D-9;Oق 7 X&1|)cs:=L F0xø6}uf}^3+x^ܓ:Co8V/GN W|;O endstream endobj 1353 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1189 >> 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 1354 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 151 >> stream xcd`ab`ddds,L~H3f3ECCa]^# L@`܍  ;@L:|?~{ȰT'%&&s|wb篝;pfil|pfZV@. endstream endobj 1323 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/hat.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1355 0 R /BBox [0 0 496 224] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1356 0 R >>/Font << /R10 1357 0 R/R8 1358 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 l endstream endobj 1363 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 1364 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 1373 0 obj << /Length 2535 /Filter /FlateDecode >> stream xZY~PVil0 EA#X KI"ٗD3>IV5Y:H:4_ۏ,1FR|v{?S<%)Bn̙_ۏHG |,d&n)ǼiM"7rPm opz:a{٬<(wHueJ+kJ훝' &5u|Ϊ&,h ߴi%Jˎ$+y8'F(ʞ%T+{p3Zl&_k3nq72}D "%&4?QEcI舾I6}TMUb< M IMb+2N4cZRDx1P=b"#'p)?tDFpcUoVE'Ve'H'[)J,zh!3 aT7sl6E|b*YƦ;<?2ؑ87'rۏ<0"wex PV\!9@ePFqQFu$E@eeYM,=e[{wX/!*-8  !Qsv 2$޹y2 M5엎'T]45gl,q5fbX^aB%8CV{0Bxcb[+wT|-ڿ]Q5W +hӖˬWm,`$p< |/qY +.: pӻ. 0{]WQp*'l8(*v>xvwbx9UE M:6vKtB&maPOU29 ex(? $Ho.U= ):! p pnB{4i.@Bfd<3Gj013V\bsYb:"42`s T8HKkBى@|MɳJlcj Q7=*BƍHhR>Zf@a |؉[Op@t2" zER uIN ,s&գ @w ֪˥8=Y7M F?DИ<ҎM=7޵Eb (^O8@5d'&{=֗QGLJ: A@C^fXp3'"҄wėYEkq:qq]80Dׁ:wzxZ8 !0Î,!)e{\5WII./I67Ѣ)z cTh ;( ?8jh;P}3ԯ`VW!J g]!p̜ x3\Cgz{Q~dy¸%i:)oW]rM:P?kb|bVQ.}%s^?Fw_i7R:xKD;g`S{/_ʾD'X'ʹ;'AY'ywq5$CmEHU:6C7{%VSse #ܤnvL. N&ڱX;Y~mxPޏR=UUܵM^89,ݔɸ9Y8c‹!x %Y|xOo(ѼSLonc!-?[K_FjO@vo3sr]` ?zt]*U^ Բ./nm/OM] 9u\olФy;K\U<]*|#ǻnUqtʳu'[ ocƜ@*wq,xAX߇3݇tPF\|hW hT# endstream endobj 1388 0 obj << /Length 3416 /Filter /FlateDecode >> stream xr6=_}62?x8iM@KT"]^_U%vx GtgzE3H|vu3|pfWǫC0)T*?_e~* 8jŃׯ~鵝|{5Xp<իqgԡ2 b*Xgy¡5B>ģY$ΊNe>`Y(ܛ2ӥ-eBDq iަ~}M( ">;2IdKjQfw[/qmZڹE|3b0f /8rNp,<]Sg 6Ru sL`law|~.NspϺ2uj7ECXY\GTu+b"<-N@ $%`lދrC$|]7{;M.J>䢀q2M/ |fD ւqgynua L_5iUY|Vi27Nf^jUO@F1;^,vK!3x`%Z컨1b?Zex 1L R ub8X#qǬtcō}xLoMJ45eƆ1 e cDq0"qԡR`F0N&#v-VxHX,-'φH;,$BP #5j*ѱP'rpփ5QJkP : ;5I1>%SpsT( _wcR z.@&3#!go|[pJ!TH}DDbLo|'S0k 6֎5CN$:Y.zD-U]1'&"쌲o{U$NOzt! N%Ep}V:BA8jaPZ9.|8cm&uw(;9;pa(A x O6@ ί=̃cB91S8 n@ c2D Q"X+pq:FC:4 ީN`v%;#0(,br8IyLtUbD̲acRB{Ćif3T C ?Cvfp×CaĬʘ>3W^YȢ%m;ֻ."(sDߡ lRXEd6 p*=%ŅIEp"$I%&ZyZm6[ek_$Wc|ҷm~grA2R}ة6F_sQ+B9z{J i1``/^AVmG}…u'NYpa>1..Ɩ#Q#C+͡NTr.w繪3|Dn3@г!C&f@ᄻB O?<᪕3 l.\#PH*UgbP$$_}zȣh40ܢHr;X-5bvot0+8?;KVifXa0 vadjYA;+1/&2!/p슴)v~0Hyf.q1F'ȩdkQQj##h Q z0H}YO>RuķE"Ua<83h5иHg5zx@çs4}+IXwOúScicy:B؃x/OsڋHatD9yX?޿[1(O,ځ(""b! g77#ۭ?ya":]CVڇ^g waE1y[\y*=u,E֛Q.v6F)Hj5>7)kk{ ׎6Z71F`a=_ܻ[+K,rE.8SCœQCy).g,73©mU^xq<çH>wmW~C '|J)magwfomgb'mWbw,9 MƦvrY£d]{U$z,Am_[?ꈶ f*CmzVOov*&R`T }|@L+A⾦{):I5G49 JϿ>z2D/)x_~[=c!80! D$ Qm1 wnP_KH_KF =Mģc˞&o[cu-8Z2w)],kIWX.+Ɵ@>6 Hmi'miibߚv1J ôdzWǢS~eKE0YNKZz&{f} z#/;M􌏛 \vDxVLW VN.Ab'8I] M`}ugtc@+!S@x:<&g" ")0z]qxTN ӑ@ |<,O狗𶳁|;J|m͸xwQYbcZ_UEiwrVs~0ltoT]1IQ2a:ؚ')Qf> > 3NN󢟋][VvzAIS>S미P?I~O*D)I^ȘF0Y+>pJjؠc<9,L4 _Em"2KIi 6efrӭl 8v 0 eV)p9qyCgfr{:izztݞEY%u > stream xZ[o~ϯ hLk!Mndd}Sc0E=JuE8sv93;YL_;u''0I,'qG8Ƒ?;2vξ>H7{a޾?v9凓Ͼ}A{v?A ':ҋq py. '^ S;}*$Z>]! X4pλwjZ7L. `S/LDw1vvTv/(r U.:0={^ wHAŞ^7y۶x =8r8UYz3;28ĕm` 7y vɝW,tkÚ 2D`&N*< t r10 ^\]4?pVE״<~"qťKy:sdOӪVP1;kI˝ JZ@^) %Ia\Պ[-rߨx0G Lx%LX)6چ䥢X`!B̩ 8v#Xꊇ4ӊ3+k`Ō $fk0!Fp&/CAeU7T8R@uȝe)HBcT,Wa%qp)İiNOogؐl PY 4Ȃb\,*`*$foac[ER('!]D4 ރ$'Lw$ћbe\֐u/"o-v(Ԧj(_L$>P"P-U(Pl"GńJ`Zep X+̖y3SF鶖\꬜o K;e:PO!|P K(C9@McBe/X\cILŀV&-nJ󩕙9&ܩxO)G9iA'9WM%([b VFg}+(YV&|E檋a{ny9z};ͻ{pB[cKbg7 # 0~k| UqԢOVfCK躥Of ] ߍy*|ml}+E{u읁~;űp `P/N.v``

    S_m8 ,⮈c 1q'~zYwͷed8O[wP9fSXbk}*FnWҡB}|~Ob-y#ZcߞeUC;!񔉛3(B];HRяx&C"y &>S!nq&l3bpye (v_? hVOJ;PDEA_>u^QuKĺM=:E BbN89Z'#݁1 ;l\C׍VFg.3)Y8*`ɖp7' _ႋ:Û!Zύ\*|C3> stream xYKs6WMθL&@Ț">bw)R-)d]Ț,'ﳓO(%l1 |¸;œ O T'cE<Euək025=og_OSג鉥8$ \l'ւ|LkYWH5)% yQ1)Nj@&ɟz$݆,SR׮[*TĤijmd׻Q{J8 (mŌvY&v}>yB~_ "{iR; {+ovϝZ]֯b1o3RcHpluVu"hNC` v2ARk]%aLs Uv.pjf]eqNoMh)aOu);@HXQl.MdthAo9 Kpx2\'§f&"Ǿ]fi)54}a"*`C.Bis0gXBl֙PqZPUbjDt]E) }c%*\ Ga): %O8 T:+S].cTDqc-޹t,516Z/jRdic6h6cE}uz8d3z |XhJhYZ鸮Nhy Ҏ2iٺּѼ^oyY.a4isǸ\]"%(] A`QKAУQCݦ\ejš .h´Ѯlǔa[@qh%I?,9,5CϻI$nPn;NjQkoqmCdCL 7.bFa Eeuu񻴪.4¬eÚ_Z\j7Ƕ5 BBW5uXoʁ7;Kƽ ^:QV*Q e@lL*j:q-MdX1X:Ms?4¸0OBqY0Z~6ݪrg(x{=;9h endstream endobj 1403 0 obj << /Length 2222 /Filter /FlateDecode >> stream xڽYKs8Wf!xLjvv'Gevk\9"lqC IFPw+)htu⋻_矯/\9.E*6Llq],~Iwo+T]VtƜ$m]w$r.ywȷw͕p !Xf}@Lf\on:K֨`& 4 'U=;N~Hԗ=NE( ۼ^4Uǖ+e=,W"ܒ@W1ʹVҊdݠ˨rz܁50K>].{Tx ~rg83Na+}j.&`:u4$o㞝nWaWu7\J,hF3VKdKg-|@#Kvy[ K18ƣ 8MKryOTtYq|x횭]ayp, 5bH+k[rZ3r6 ]ϔ]/J0{(vQ0 Eʤ0:&ʘtkJpΓ=A!p$Пms; 3o` *Dž'{R7=cBkqiN#?mTuS!+f%{HʚDN 67xP("EIi#u<6#F }ohuUfK@]!Qu0Ӿʛoii[mj_ &PZ$(SKz[o3؅+=~i4l$&4,ۃp\^hRVhǏ9*|TRG*z~ i:Is>H9&9  {[ޕvݎIts$`Йu1[ȳL1sHYze\įY= _ÜQԈgz`A(ʹf1ʌM0!飷Woo>g!)}`93E (`DC32f+*\}:)s[B;fp&_Ci艢/?!G[vrXr˜:`rֺoG|edsPs VޱP b˸~-Yc-Dɀ2{83m泩g9J}.A(Z8Se.BDNu!= FahhB>ZT@,Ѧ&B(H35r.g&H1I1܍;,.=p&=f# C5FG]WZ>= 54&)Ƒ89 xM?ZOJ-FRJX8 QU+A}}5Ћ؏?4\0 :)Ȯ;ipz,M4׾m(b+@%+g~iF.<@tS ƌP:U o4K?_LstnFDpZL,Bk;n $9X4}?T8y5n:i{ri.[N>s?4vq {VǮ~2[7v@]G3WXq̡ADұ zm0d'N{+䢲Lؓa!=dm8qʔKUY&0)Ss((xD/(HŻӟqt.B,򈄭ST./EpQcj}bۡ3tB_$Prfo]϶`)NM+_cI>H¶@L̸hTN00=ypL8uPlv`E:yRr~)51-. mz`T~`U0a@C[Dp d>uE >) ÷},xh&)S%g?Ƥ\ R_PJFbs͠sv-P$~;LT9K3l p_R(OpO84 wyud&|$xH~%_T}U_N|>Wgj bMVO ʓ_ endstream endobj 1412 0 obj << /Length 3151 /Filter /FlateDecode >> stream xZ[w ~ʍ5\HdnO6'MZ,n(RKR`xGgml 9yuq5#YbtbF .棟;@y}2!GT~ӉXI ;^__Gd{YA4'B3,IDb\mf=Y||y M>S>#Y:- M˄벸̒,1]6yVEA?<߫oxC3 tpT#w.cn8oDI9t>nf|NLӸ'be^ @'q&UM7:+ O-pu:Kh/e\[޶Ӓ7N \%Uv \$OʫS-g,e s!||'dԴԹK hA۹)H.NqhY=N@WiN/j Sq#D&!S2,=2֪_L5'4 H&vؼpzK ‡/Z rzKP;(a\ 1Fca$Jx扱ɯ' H "y*V'?Pn i_(}<+˴<-0Z(@ue{.jjqR2)8b>@3O ‘C!YK&PB.}D[-/Q,A@*?n~@DH6[Z RzO@MǏ6Lwn؊WyhX h]pi=cw:;0;o(PzϝzLt{A@z@GNpr(˩ tFNO<]U'+Mڵ@86>2*h+84 CA%Zj!oEL/N"`$eW;^>'<^ZGZc&^`8ˊb5le^a {J 馲S`z)r  7*bړ/y!~7ch&M rO;KS=;ʘ^Ӷ[ZXr -\ZsWeZOiO׹$a0I!]Tw=ExL5R!ӂXQ[[3^eZC\ox*[;Q8؝>d]8#pÌZ B⁎ȡ"ld6I$mez{?7'3ozIpm03ڊ x'^=L]tZG1ACɤO,lð7?+*}p4! ; 62j+hRntJc=^EA}?G٦0xXN {zqT0/p뀒{:.|ۑn=yd ?:s>G}fw l>n,є˳"Iph}}Jz/fEDI1R&m}2ND=G ᓭƋѻ QwKLw?J{3:qӌpӦi^9 o~kI_31ɇ^2Sﶙ:&[л7/.bB9ZP=k`-"/Ï0b+VM[Ƶ{i#N)7u5}ҵCbEc>ÏE60TG<=ߩE%bpyaǤ{&>*`r哾7&ɿo,t endstream endobj 1419 0 obj << /Length 415 /Filter /FlateDecode >> stream xڕn0E .)b8ww1b-mkP*1G*;-!M1<hRs9N>8]9kbg M++^e{PgQ].@ 4с [."+FG ȯ]0C‘<e9pI[3ɸsh9cHPˀLuRZO5*36@dӠ9!:fxj|YI>ɀnS$:DC}:ShAc 98~;Ziʊ]g_GWVaR曷SsI5(OV6]7_^q9q=}B7q1| mf;sON^oM? ˮ endstream endobj 1407 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/membraneTh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1422 0 R /BBox [0 0 468 459] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1423 0 R >>>> /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 1408 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/membrane.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1424 0 R /BBox [0 0 468 459] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1425 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 1409 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/gnumembrane.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1426 0 R /BBox [0 0 360 252] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1427 0 R >>/Font << /R8 1428 0 R>> >> /Length 89417 /Filter /FlateDecode >> stream xm֯pidZCwungN88Gn$E]+FQw7qQ> oMqB/\]̵~> ~ e8ERIPcS9E7{eO7\Dm[DR7 -兢&~ 5O+Z~^(ʽޝQD/P\goz!ɃeGrjXOMq7|Xvw#_ GQq AB4;9;)+]] B?6 KjO7P'_FpP R+Q7kdۜ}uEߟ\8 ڧ8 sJ*$D-oNJ፷?5$qb79]ΓeNo$oy#h^X>=~+Nn ʫW!o!=R,B`f,ϗ!l$[/]*S7*BJo "CF%[H兟]^~_bajl|76O_&B]ҷ nT$R$C_. /$Cȩ A !7F7K卑T*9A7(YBno<\˗8mU_x@6 o~! JPBk'؅i$ _*XIߗ) M2>eZJE2RowFp 1pkS} A1rQ 6ANȯoy+} "/BM}X/P_ .=#­}]zB}GܪN1.\zB'hoОnKOhk/BŻޘyb_.=7få'tF GjZ镼\zB{5Cx }}$ ^1I=;qq^1K=;%:E @P/{w_Ko r Kf/RO 3Q$oROpsW89(teqۏy# xA`HTj;8O|s/$/7uw!('9PP8yRQ{͵pmSx@^7NT F,Û[_/ ^lHETHSWDRQ>n_o&T}}(\B6(&'ϗCPȗC獓ˡs(ˡ/<_›C!_~qryBzs(ˡë"_ xq(ˡë"_R͡/v|9|to|9q|| r( cP18P/<_ӛC!_3ϗCPZ|Cˡ/|9||Cˡ{s(l^r( r(\›CH)9P)9P)9Pf^.X׊ r(TߘP(CgE_r(/&r9|or9|~A6{q(ˡзț \ xq(ˡs~s(].or9|or9|no\ xq(ˡ{cr(9_(cr(t͡pB/s %9> P%9PQ/fCP.ս9PSPB 7F~?59P51z9|Moz9˳\C^__r(Z r(t Q/8P q?ys(ˡ۫!B ov9š.o񅛷ˡ[zq(ˡй3oCPhCPu۫]ܛC]^r( 2C]›C].D!P.9."PhC^ ʛCU'WߘyX[p͡.Bx3oC^ r(1 .=]( Dȏ ](R$I  n:++p*@CWMa":E3nbMEQ BQ9)hkkwS!v?sS{l")r¯B #SRr)`^`]\)Ȇ/Z/Q膉NQZ 8fZg[NSt?C/_P ׸) =N:Eo0NB$7E0 ɛ"l"ϐ C/2U;*䢨8WQX^>(T/z~Iݧ"Z "M."} ,K^f ./.N"M`*:AӘv'Н_CZI C'ݳ,[EgO,%0E)eX0A6ߧ@4MP C'(T C'():t4aݐ23 rR~,Ԧ i>(7wk6Wycuݩ3 [׻Gc9N2\V9wM:Ζk@;t~;27 |g8 瞢n^<)xڝ/N{h~y*D?//>>JSu\'0x7A1]r3/Bs_~N5n^-SE'h߃F5n^ K 1{ k0}Mb t$p05YW1 C'-wd-35k̼VY3QLA3|f ߚcỳL#a9ž=ʹP'E M`'S4^޲{@hĝ@=tV ~ީo 7o]Wl>9Ս]=;*o< = > ;4Kt}j{Hk3M;9JDa2S;2lxu ?Һe[A5<_D]3\;Z#]] ?3\o-/>;WyT Ct۞,~٘ρ@w=txsDఫ|܂b_aZއ~[ X흻v<Hnrr;v}yQ1ZN}y .ͣ7^r7D | cooK 7c-w< ]y_Hw+z1xϠpw!qN`8b.VbH7ilr)tFa;2wtogZԈHb9>7L!3K7p+}fq;{ٞHy yJyI}bhbGdT}F%!J|4~֙.I0opw#=9i;8K78 ~0ǩy~n|:!,?W z-EE3Vާ:x`)q筱$KiCὮ$7K[GA_Drhr rv_EK8,{­% z -B{Dz(t~yp, pƬ#dP ľ-k`ǧ+IhU˗X3et^La,^\G5ψ JtgzL rIT|8}w0jz,iX,ya}X@QYTg%e%}z{rVHe+_@n8Z'>=F:?,>Y^׵J l u>.>w9?S!j@`;9~0kś%=O; {Ɲ CՍV?K' 3B[.y|~}u^I@^ܸgu/,LkxfepO>Ծ"CKRl0G;nro ,F2 5<1 QE>mvg J%NqsN b acS]BCrCr6Hn.Oz[z?C}Єvb俩aRzjU@E>[4a9utUch7쩏yiM0/L=Uy :yyAu0oV C; 7ӄsB\$?3P9<#~,4~a4PoYX i ;n(}:i8Ć8͖0N-?4yʹ!m~Mc/&ӹ!C;ܰNO# #}0EodE&A|u\/nv~#,y K;t(c N˘rә mhӦȋ%MW<"O\zD ,s$#oڿa K:muS4Vz1KC991:dN:S1ͦ MƘ6šO7#7- >rë>Ny43;ա hM%AQMS)}šޠCnA:F )4]C {:(]u|m_jW}tinPM8 \ty7@0Щ۠Cu `nt~ӝta7rsХ.A7} 3ln:oyS΃nzs {㠛n?;.O| 㠛?;;(7IL(JsddM|AȢCF2w i{Lqk!;M7]DO<ߵ :O<覃aD:=kgxM𝾢o= 8/8?Gkjt;I2:{M@7 :]}n:{ %}tg^ U^A6ݻw.:]nuS~ݾlI'9N𒟪;t'Œr dw;_4S:NdM'C"T6{R7Ȧޓ!cug:hSZSsnzfBYK|Kv>gtMbt·NA7w~&Sn]Sn^t ;TtbfA]nXV}m9KCϛQ!NuUfgt,ݩ9ݝtqQ`]CKI:PsHuM靾 T٠.a2tWzW!]N$d;zA EJ!yt:cK:1O?/Cf%n>g y<tv΀@Ag9ГD2=Kg-@xyWz.A7}3ѽV1;#ЩA73Bѽعb;dPu堛~HeN/޷0&;,TΘ\AgZ0;EgNAwQ᜜1Ì,I$k+y͐$Ȳdy7*[it@fHdaStY94W l4/^|Ja֊&tІ]و58($qT'"9hx856,@N9 ^-+g_H..ʊhܓxs9]=Ϲ)J:SYd6'|P-,'lkr_yt/sx`tp& g; I)YvDS%;;bʋqk~xi9Х bA]Bt7oͷ1!+oJΘkoct=RP=|3TMtmȀ ezԳPBv+3"mf# t&ۍ7uVTb`yn6AW`y5n@D, mMZm7ކ,>;ykCD0Ղ&x6om`#2oh0!x>t]dEY`3xhA0_/^Al7J]l )g>! ׊ yu:[Y !<oZNk/֭З>sWx{a14ٽptoc5|1pM'j oc;7it/zkl7t]S$veޡ>e #֮ڒiv חsW /uLW!YЙn (ѥGŸ$&)o]-w6nm~m7t+Yhy@g6VEȏʓl7ƨbߚnzt -/My%6[(kA%gfF=3׆RB\әn 20;׌h`6Ey5#06Iy)n sz^ztm߅[Rx3 Rxŧ*<ȍfPLf[zIH^y-ͤqNy0ͼTtXylHy521T:ۘ2>Jg^/F &t敜lg |PX3׆A:J.3o]-ռbo,ռ\mgA:'ۙ1jμR̛-ռμit)l4/Umg ǰy"Lt[W̛h@'ydә+z/Hg^)kb-tf^E UO/& A.7sNtueF*yʵwBH%әμ 3s62vMμΦmgAi™7̛1E*y5RAiҙt3@4r& H%fۙ0tn8G:J3o T:) v"y&*I%=3 6rL"y@gm'+6r"yY7˄-+TΦ[EY8 .U3LgD>:i9HVmg4Jҙ-ԩ$@?gxy [8:SG3Y4{lgބC0? նqm$ \`;&P!" %\` R$LgFVLJ^U3el;6d\ uk0Af_:ǰym3LgmztUig)y2Yde:/yۙBwztUrgy̫μUt=^:tm 2j&2..Jg^}Q#y& <ҙWb;&0 -L#ƘR:y\qҙW+DxFgu)vm4.` -3Aۙa'y@f:&6j -_O3oVu&f8ˆcnFmFr zbf-t *v636:~?\o&>e8r^ jgIcF5>Ϻcf _bڀ[]EgomC(.%ڞbB.脦kotu:W1D۹7X`b x -lL/+0HʚMظ0BRnqQ_)e†:r 4!`.4$2 \zPm  *HY8cːJ<]Լ ނ4!A< Z.1$f\:r˃!XLeh<^XF¦>7-$\soB ΨKoj.XN,$0lEm'oδ Z\UHpF6gZiB5'oδ u\QHp Ǵܞr?!dP;a A2 5]Jj } HȲ |gáP|/*BB+V7,{ \Κw t@`Gb]DHpeg2 ij`9CB6-q D׌ YN beY{ӇA}# /i0rq~|+ rsUjq}JOO+Z&'_?_={0ݵtm}?pbpi}ڭ>uB4~>'Hth=m~a_Gf2KUnuir\}N?S{]=mbvGth:=Z_G6zn[}AO}v&ӽvأp_Gb&#evا*V6qC`{i=Zm_`rGhX$օ v }E??AԏB/̈>1=jUZx [B'fDs))[} ?>̚ኝ a3ھQ^hDC:UoscWMOL? ?->`dž& ީXCʾ"5{7.Kzz˩)G&̞xmDuoҌۏ_8C,wJ%!O(/6% »ށ}. >)N>]jܗBxk9?~E/>:@) z@F~|yb|]=t:PGYjg7"i!&*Е; }z: 笠:~GĢёࠃq @.sx}> >T{Vq?Uo & _8 *uN{_ װ,6wΣ7`8/JUpF~oDJ} xulg3;Xg_Ή0Qa?;P*j>6EY񌛫vEKlPf6}K`@ ?O2 G}iy]6""' +]8ym ( 7Pq`ߵohWۤ~s&;/r}d s?qvOz#/^ .gBGF`(._?ƀ'Q6q^w 2vFT9g3`Aˮ1kM]%wdR$HldBM86s?d Cl*M)p6!ln}8OJ92'l\TOsc66C9wgddll}UUk;/ o>,|~4xeeCﺌƜ@_Lx+4˞XݥErntWeW(WUX|5*G"> üeۙ xrD_60y,sOUr8 %6# :!s0",3’́aesҚ,=bn=;e u/,B@An ,}3Ff<(Kx:-eɞoxS%W(y,`ڂ9뜺9oG,7.Qf8a1^|hjsOY\7Ɍ*y/'DwU<O4퐁liݧˎʢ )<^cG̀Pv+'*` )"?\p)Y+ðTQ1x;Z 1zZG kNY,&dq_5a:hi w'aVÁqp;e-`41Y؏EPyN!zX>/-f͓.P0 ES3wy v!4A;PrnyKJ118Iy<1N}JXO&4w)O+/zgLt8>V@o^/P0>k5FBJfއA&~[ZkkOYC+$q+|Fwώ`BU}ouP~[hHyJD'&,v%⍹a6ͻ5O? 1ǻ j13Wa@}B3n}vz?CkpC @*}`3g,>!}l o"Y;vn6 }eV46Ųku?gDb=qv Nfw<#JD{?KkxfNq'ʔ&87xhj1}`_cw$O!?ɴ ZW<;Q>^_88k/cMD_V"U{kzE~'?G_$p}$V@9EZe[!?qxjQ&Ey8XkR,U651xgz3ԫx ;8{Nc>Ikqz,1*33"F-XM">e;gw(=_+_g:YikWg&:g&"a]4D'Wâ %u!&ۯ,\Lt%Gu|.l3uV#Zi3ɂ"4ƑDFuzE coӨkT2$ 9o#ƬBY/@FJwu>)$00l'F C.ث8uL՝PzSf8sO;iX gt|BjJ|ttgkwrM riCqm~LqF۞ El#B<172L\_>Y>{W=oQDg`ПO'3?~L%r!Gu'~I("`!݂Z?X7Y~#!*) \l-dr W͕YDmJɇuIsX E9KL uhVkd΅ƾoH(1X+ku1^>*#jPH{`jgz#Vk^5wC? !Or$>qQ=qf?tE&?"?EǮ<|XUJѱ wG95ԅmŀAϗ]>AUX, G@$z\鈐8AZZ[>?hxx| Szudw(Li}1[߅DLF9KcnZ8xx~ nzfw'ѬyT^+"vNyzFG_:u^f WhMjS`FeM+K;ɾ${Bj0q@ő,^) 'Z%o|_^ysMU-0n;bb<ε_JLHccE{լ:DXYxLnvRv~3 zy :2؆ JL'x D<{A 7s+tܨ,l} ]B-,&~) 4HNo5fix 2rg`nfFq?ҏ|F{Mޒ״#j{f\th=8}%y:gkTg/|ֻ-H8HڀId9">pe;i[-QyGɟ ӕݱG oc|Ovj@I 47R=#>ej^. fgd zJ[+ -gg6Ąye&N=RzUca]8Ȁu;au@MD ,!x[èIJe4`_aO>t!P4W__8 JvvԤsF"3$w0 yqtdfSAml,V⧄x"~:@^s!ew槕[ ष7D8c"SHȋ738 æ#c}J,,{#t5{({;`K,UI"0+2}&xb[ONfs['FC!PzAPX/TܔMwƬ+a369tH,kqti.Vy!3OFYT;^m!?-0nŗP.OA|đxs W֑`2hS\ PH@?=KE;"MW;/>O8~"?=*z!?%Q O󆀩9H/ s rskU'53[kTwC-#!+4+M4FVL yXQTR̸RX7_ߩqށG\ mD}͐^&@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);MgmzrPL?V]p[;͠zT #au5Oh̿>]NI?=߇d^6S3inZĭ[i um&HYy'yg4v0mm^[ ]/3}.ν$BӬ4zNO/Y>я{\y1q}WEը&o50Sꎹ2Gs$5Dg*;!삳d N^6vakSB&k\ 91*O+o_wb\:pZPv[2VD#8g egWyFmȇFrU6jĬg2|r?N2dyt".'21iE~U[.2W_EΕ"uf㱙RKI6Wx[*볱V"=SC4Ѿ«ٚG\ [9"Wo&vJ~VXw"2nnngar겍³_.TOזmu+t0 -?-K,Վ95t`F.ÀdtYsy$XoυfOX d8B߹zi6E%L3-g% cs(E_? ^*8H&-Нqul|4F<%/[ oU%H,Ua )̨ ey3_KL%] #|K^5I ron Bj{m)KRwplz: O9-,D>*DHJFst W;4Ci[ PD-FۢWH,f}:CIO3Ck@lp-hEBSG6^㴹\0ǻI/8bIq Gu Wu uQ/Q{s/%0XкsGWiL2Sj|I=՜CLhU?re'^8-j "Jk1uI3oGV!ً7td 1\u\)txTo M6N+K)i;7 ?#1];+z{':JD+p;&}|Z Ad@LjVt H1L,ЋDz;'߲'ZܞR0 jdiJln v)DWeխ=Jb>{R*-;{NNSژldΜZk|"#namFfx*/<=#]ڲX-IBÃ;5)3MɳgYG-‰H[V1xY:GW8(~"qexs XsX}df/'.n~DV3 cVGn^=Um'QΒH"tA Z&>~l4L4c\r[߷ţ?☞?(}[w-؃S+M.Nas̽ B{ M`rnDǔk!.>ܤ8^ixťRHfCQD@Qqhk(;j&02j?(H{SHW}hKsY?U1Ja0l LZϔ˻X T,<BCPcw(`Zuܯ8X+l 'Qt>ƏpPlVˍ S&5%5Ef^klQlj$NxʞPzy_зy"?3O̒IObTX$ |%+%~[\"'}rZ)̰n|#. J@j%TvJG:w3zIq .#lᑆP 1 v7{+, }qx_HWj1h_L@|rKl.y2$@hlri%!/IKB"5s5H14\&q$EFph~#>kN DJ+%uC68iDބWޱt(֒-v{y 4b0u75uMfE?rN2J05]-]I;"ϳiPWP$V⧁uvvZ&00HAKWQ]E&V(pґM-w ~e #_[s[o (DqHnlgGMgpہ ہ9;E4 tc `rM?3ozX>O_M ]Dt~;3-;c0 $Op:<&ְіXI0mW4B1a"C}ߐl߻ t}qݏ9F#h!LU_me lLc{]VmtM򵄕:ULò$4n~Fz҄fnRv~*1. pi{kNv.c9s5]'HͲC Ϟхqk 0ꓜ')fϛpLPЏN@:'i=ctaV:= +N?SÌLFY<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.pE3Bo.X b }w`Wvx/TGV.44w4wePm>-rt Ώ:0٪{&=MUpWzC'J8I`ˀXyQDb+)@CgDTLک,:ii}F(ׂj*>@Ë^rRLHe4Mm& 9>>huO6ecbZ\ת)9XQjg$ܑ:*,NyىD/vrd xUE%+_|?)]πTDQrD}#TlB9#Tom F|ΜAEFHV"o46'7{YnS։aCC}NCO󋪹K Nn |>:{xV:ݳPiLWG119bp7]g}:U9[&,*>gj6-;RxڞƈP#`)x7zAz8Wt_Jو/FwIm"GE׺DNi|!5oM>Jve]/ +\C. |WZRIp7h NDrr|#WćD'^K\N2П$5^I(S)Mfs >[]~8?#~)syOqKG쀚^Ѻ;iʺ>6!H޷RgXȎy& iT@'g'.CZ!nx&-U- EkRS;4P,2*#O`` ɯ"G®}ho0/e`0Ԋ1F(_󎦓gTFGgOOźMl.EIMxcuүeS |@a!?͒=C-&ށ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>:{e@x{Tk񉰑-rVsBHMюl<G+ A[XCcg &t;rg 7AD[oENai;Bޠط?𘈗;푹|1N(kPh~!Qkw~6pg.yZ|鐨 L$ziIuϳ1e[=9ywѲHTB<".DSSFH7Hf-GˁBYxRכxcq^Լ=|}|$u HS-#;速x^!ͺy Ssg,5'.!>F˹3C3Uu#M-.pm>}\QLXN%jʲ)MDcE1YBϴЗ,\%08կ }`5[!KTD N3F?^=17{=b[[81O\>5Ou\9P^5e6<'!=z6%fe%ŝQVOMzQYI,gEK ^hT|jV:gS$]jbZ:3 z%kWGH2d ^L?;m|?$:ʓd^&4C))oz} yv/LF>r.8_ϧՑDB "<&պ'n: bɌpLj:F1}rB$ #S <@/Gα]mVJ`]ߛ[视=OYgiB-q³s 睦 T9@.YՋ^\・V[dd5߇ pN0W j2Ծܬ^LԊ]v}Ϊj wHHICJa^ pz.n ۻH_`ffb;S(/@][E[bsY]'S+]j$L!u831Gz ҉'8Y& IthD$Y1 \N?HS(цjG˓QH~2M.}Vt22>x??b, Ee/7M0uY7Sjd P:O$ 8Ej]=ewήG =j~Y.K_Sw5)tDe [=uӼZ5q])%cnNn\"֐\qǒ"׉>x'+W3OhkxTedV}lji4GK7rq}{8ykClvC%MtL&d}^ qw}'Y0'YA[%gKN}ڕLtaĊ$Чhȓx? ۩穔ݐIEI>D1Sfk$beXd$fvo&|鋙1@^7?{{~ѭp}FhJrtdNP"#c͌0Q_e>V]H9H.G!>,- ~jEC`FzG>];ԚG:4ݲ$N$kڏ6᥆O4 >Ǖ'SX%4A J aW(N}J;_mwUMN~<쌂aWD (;~Zt$j)xŅ 'f_C,)'EǛQr)r>/ :q9v9e=w&èr[@iH$-mzoHyo Gk<=z+VGdG~9b]y?)-Dz ]ϟ5 } 4Ay/MtH44R}@b )*_ \V|*_skl2t],G8VT(d,Q2j AL b<,JEE98x @Ƕ/,DEDH+=B2:0=f HL-gGՀ YM# h `P3VBþJO%1LQվZ_q/h)aw ]nZ AoSpLLQw]go8ؓP.FΌQ׊XQ"<. V [m QClN vI$2%O$Fw lTv( vX+)R]ސGơ]{^K=z,׽u>!vo=ĝq~72<UʺNԨϣZjYXQ0Ճ Yi*/bqzCsRdQ;}հãwʭl7wҾ!wś HH.2t>NZڟ' pV+[X_M?8 yx Vk:Q^u塳s9&]H0 d3HZ-#"dTBp>;8!,CXt&wp˱S;^$#:91gB{܌Pu ԁw_YU=YDНuQِf$P_)ܵ7BcStx5qm s'$X,~093][L,w"Bκ@8)ZNzsXkT׼t2BYTiO8Zo-5XB BL֒P]yG.V^6ױuag79! ENSSF3i{)Kif};TΟ('a]BHu^sgtsf#34uOWoItTwD6{V.9V{Ff@F0nDY)߃m)ĥv8(޽zJVىD?"O(,f~y叇{C6" @uw wj!,NxS`0䳁|6H V'&o5DBt&?+IdpU!1,` %_[˃oCҜÔ3kݒ!fjuU{lu.ܻUZ<SOڬWZsA9th{zCȴP2tͩ 6@օI6E.wK9 =;Tc ֭E|s)m0Bg2\MoJ bмt+;;g 0::1'Wf`'zPԟ RX(q NdzQډGfќHzz&r%pJDBu *əh'$JеT8BJjHDkԇ{&HGfhd{z <)5m#ڕn0 K#`W5.lgIƬϿa]7zwEɶcMVfssP"87̠/8[' Q7.+*TfK=4$i ~5L8$b Zg\[\hqst5|%U--dC Uz/!mR{gv\Mno`HzyԔUNlIeoൊd$*9̉t,aʞIT']_`g#KhɊs>ЧM#0Fq2ִܳT-N9M ى\hz-NS\]c;Q?=~_;.";iO1Z&=$-52@)Y#d`_=^,-Q{ؘ鸔:iOٸ9]Z|Ƭxj3ӕ:o15`J>BI B*H\ZahbmUWAٟ&`GABd+w#n6xjJӺ%W ,S_mQǗ6+AרblQZ3%_w e5Žơ/!dD:{?lZm0U:hlWjB](~1NV'-v*us1q5*3䕧K<6>zWzyY >eJ_9b{?Zv|Gڻd]JEq^^B&U/7@z: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{ Z49{3*kapH>R]9u+Y[&`wļObwO90i#[Ϟ[|wn,"7w{~z(1#4u괆!P3>jZ%>:5*jR9)D'UDqVو_ j1sUvTv/3p\nWfuL[E;Nù*i0-≗Xպx=TIdM|8A=1} ^<`cp9MaJ EtF3Ÿ:v;w&oL]C#cc?N3#;s&YTpo]y|D۬4ka17g[m~3@`CJx zg+Lo=*=5yN^P9Q.%MZ JGV2a~D@)̊n}F|b+l[A-yx39z8JdjmWԟU u1Zeql~e{6z؋+)b\9'8k,GhĶ3_mAw{lJ`vEvUC1^y5_1>ʤ;FK3M𨎃[&Uʯ^]"E# /4`θ UiNDd>u8;dX"qk[wL6 Հu\3->xsICބi #8G'u,04juŀΒh]_op پFˊ[s|KFNíNO_}Y4-Ao8DNLC9E7'BSP*2rx_̒gZA7Co?l4u\.dE]g(jn"{gZ/u-8 /Jy5ԧVV;^dGjcAVlEW-)v_-1KpEYj$98d|N4p}_ ::7n^f5~ ;?C W*;XZ8Kúxp5U_c-Jg^ٶCG&|cЈ-`A.se1jLQ5"PΣ w[MEbBe8qbEe}h?䙏kUHŤiT puZI/ڊ{vѸ }ԩz`L&vై@+sF٘;2'01OWwΓZUDa'4jӰOc(1R㷏Q\3qY%qHAML ՘&8lQ-9? 0i.X <3F P~C[*@c\|}DxB㖘&aA 2DJ0y#oGzzCCbǏ!M3D(4<ױ !i[ql--@{I ?ފ%F2 -ďm.#ȶ J͚^{Ɗ> -L݋rIlV׻3<:Rt9̾ߗLXvb>q76D&~8aޤ+t8*ڎl y nE-)_p-v>6E)Aohv,LM˭x`q[Y5XD?W-8 r/<\_ܷx[~{Y! >C)2+&)8*: @dXxACs*BިFgYiPU#Sl*pЄ "HO3 6~[46s;]V)H!$ cbOIr(5wb|};~Ϸ/' ~~g<_EN)`|߻yg ΰOz5C*&RgaP4C3zQ3TXfFofI0Y$5-V,5 r Rބ]ÛǺr˕bMX:"gT3Q-#Nasb:iLL\ EDAz|vGh19i<3(ęUBӛV$RXp&?\JJXђAѕ36G]ŵY׬O`mKm[Z_7B|c< U1_~/)߿udF1ȜE׹x#zikM35-~ψ0cGϒCZĩl} K1* LpĈzHa.0 `qqh d7/~YblSGJG{oN:i&;Uog(Tûu/ÝAVyeg;3%/ɴ/⩆˱BZw yhn?0->C ‡-A J#R_pA7Guqٛ,#ȭ,'l[,soyiWW~A3]-ȸ7फRL([˝G?vmWGZTg/@Z)0SEJf$Wt;VQhzH g6zw-XUO*GZ8H h*BMW%$2PJW~->icrs; rsHMpE-W>=vq"~pq? ?SsT؝{\@Z` -=*{dZY0/ǰZ5d"tŠ1ŠSi>nt nP•!|ԅ+>jöXYxF#2iN]0L7.l/DDֱTW}MSyi}++ z ¡/xtuD*bVr>bv%h c ;ծ*Wۈ_Z_v-_!Pb B!u9GThxDV 걐+Vu^a+D0 iOTC?!^U(yD9evbaoе{ NKۭ m [ةHl !kn07y >oa!0ζg ehf @q@!&Q/AI 9Rcdا+}r>j=<Ón5ca[Y lw %A*8rިdbpyr1;W&bt jr5 fŃilpC z4r1ጂpa[2L ~=ku Vݼ5Y\xJ0ຠhz ]vs+պ˞ y@T.Egȟw0Ei3ctAa0Ɔp 7 )eO 9}[ic3Ԣcz~;b%u; ƵzVuA >}{HɽLb=vDrk,KlYYwu*W?js#B5>MQDh} V?m~Z6㛅&45A۞+ sA"s64FId]QF,JiX$]*[$kJuw82`ZΡͯ3gێp1iȗTfx甄j;|LY,~@T/詾Kvt fjQM^¯\v͗? ؓJ;$r{Jq$ dϕHwXeJsU+@~AY?S+T[}\*΂?k(܃;9HkervCF=SDJ~lRȴ=ސk"+iY̓J/|3{Ѿ=@Z}@s~qEy=^+W`G/>aӂ+."iW:zVmX"w|0-?G}YCidbLq5WN7(φP<쑃@ݲEEީoj@YRcٮ{[߮ 1 gH1>Ұ)ESwnzHc5vH6/\z x596J:9;JBJ˒x^ȎJGiq|Vܼ`ge{Jb=)uhoѠg39S#7B|ʊlQY[Ta <ʡy^G OӒr=zOQq"|O~9fĶP%mXwfBc=|~01'c-@aB[}'b/z)_#wE@L=[|j+_kլp[+lr{y:8YD%+O-dPFg e}L.g c =#%Na` jW C#t.T8Al.XsMڲL"jlsD^^u`jBRTgBRJ(K~qn G;Se׊i' `wUnM6F&6(ٷ]AX(jh7]t˼iO3BwsLG*zP\ݤg|^ %Z9L_tߑRV-qj 2(: k*rlGB.D@aw0(lBbCM:ҕ}1A0%4Jemof Tb Ղ墾g 1Jl(G&gR'm^Vx#d p< 3\c 220uU|Db,s~(si&2{Ž}{;5&n'6([>w6$#8PxF3g؂ q.x8b&RC! caJOu$OW$]LS(]Ҁ}92:I?0K1K+NnQSϢSSpj+ ~;3< _ra|!=_XkH=Ɖu04Y渓[m+,sy[7x]I! 1"mC~ fx*:B%u) q+8_#\i=4črl/xC#M50F. .LS]`b@ #YjPxf(B/F֖- e$ue'Yיl ґHHXhfH Rd%Dр2hG,i9Ĩ氙J,I B\PJS_"#d$t@8 /d:4 b8Gz܀寚Ɠ$k._$.NE?Q<@G)0+rUVM&=Ma=q6׌J6J}0җv~%2H :|7G& }&\4k MX,ϝ#xFF_.4&>52;徯CbԼ)c,bZ(T11.P>8z 9>FkCƆK`5q>ن̨K(!] 2&1D.1l@U  eH #u᪋SLp !'Mj/>jVҪS}s8]5}Z7-]BUMoVu5_5~`eߵJ:\} |OO=X/0[Qle9=SP.:{qr`={ L\N+zV g5c4as;Z;s$S:Zq^x@l ^u֞IK A)i!]r dv4}:j{Qj0ؿF@|s:p3% tAx(rAv mvq \|NP0_wv_two`\zFByw ] .":!ƅ0'LtP)> w~E\+VMeȲ|ߚkaQQ2npub\+X6Ɋ IƸH~f^< m5/0K-1 ׵_tNibdں̴q[IdxH+gE!XĠDJۛ~m<[}2'[ꋥV>y4vٳ(5o1sL/qr!Y qmH_ R[e4 HQq_ \X?Icq3|ԭ~ -!1FM li 6E O  ۬KE0l9HΎ3P %:5A4r,Gv#qGp||&1B\zrʞmU5'{4FS$m<)CMQ>! M OAԀY%c WC7W\E.QJ|UB"Jq6:3YG6+!I׼<'&UW5+Ļeyպ88Z|Z;;/r@D !y# FpBt'CӀq1F),+S{}<׹mUB%ZĢGW*9|i+%Zk?3մD6wm ~u;a6WSB2m:Z<."dC}zZ?ȳd+ݏjJm΁P`9_ W[m:ڷdPٌ>JzDW,"{`4ϋ^"႖dFˠ. pV3 wWRI4=  -5UCZ¨<{ujs:q C .&L';lgl8M2, ӲseSD:"oYܢ: $c%̡\/aN˻!vsddX>~-TmF>Py՞O_bc%5fT`n8ཡ8Gֱs ~f4 s R\ )?8\8t=ׄw--k h;]<,9?/P )Gi]mKV\.1C5T} o0!"κy5~osֽt%PWFe a(XP$7Ig1Yh% 2)Y =ԓS gk^pĄa uz# @! YZPk ipxӎYH/`Edpf}.~8gj7$Ĝ^m];iÀ0;M\(䢇Y`PjaG B;X4Sr-1اiZ A/Ehͳh]snyA֩MfDb$b/-:z*&xzFӖ-tyWcRexJ^Q"L"ߚَi9ĥ&}coZG4o#r;M p$LxE;}l5_rIv:P ZlJ)[v*ΥV5v?h"ZL4~ a?tX=Y=6ntS8"Y6f?k=0 ͱh|R6`H}>~"Ae  ݎyv-0 l_O@-J[xUQm1C' 4`Š1E4awnw"'ؼʦĈ)G#ĐCRLO}8wrC]nO}]QpMob=.aCsK$;L@i}bI21R^y]UٕEXz-|g} 'MЛl ޏ@7|MGlкfͯ2Y6=hR̝P捭+fJVio&TR|=Q`hݧ N(&R Uw^hrū>Rr\iT?-$1FG^JrcC{H 1>OEeA.PJ @֊ywVچqWw+ xG0EʅwOvw|Lذ'LV a/Hk5I (1c]w|{y5#1To8lŕrbijBiG0FX:u3^oV$xX\Y=1Z}@0zށZ8k?篑`}M*ߔgL M@Qȉ q{us/qsf ߞI(RlzJi'O[rQ*T"%OZQ¡'wE-y~޳+LԎfriu {W}m{W gx=vsd6 2Eibh;I24e35!KrOwE)mݬ\7k_7j4@[epqR }E7E#~pߢ^p!ώGEn>-M Cp ['tn{oMm?^ן`P% Zuh'U7nm]zʶJitVf‡]i*gGS85\ObfpwۿHTo<72id·ro 2qqe1" A%B-VjH0^H}B-AG]fCm-?>;ё81N(Z\XH&"K iI:jA>}m{ۄC6a7û=]*lP\3]w^@n`x!TX[Yڍ+^4 fB7'Z @ٜ W՚,[|OBuy,Iׅ#Tq]#kNo N3&Mk!$8Pۨ\[<:{6̞,W>ZʿX;F{U*Qu7yQ峧}4ۻd?[a{b`|y[- 5s ׏;xQ/ (xSMIkAJ1> !,8]  4 rԹC u@ ly֭<2uW37|WL(}StS׽qB$O9z3'$}pj\7D֣#fK6H Xe%1Y0<&RB˙]~e^1J`ޛEe\6(a=~jɿwp-‚N(!w]]"A!66,B &/b  @CW@u5C ] (B58XOQ<`Mx!)R-m87nЦ :#moUF<|wsTL(gW׭+rs0%9zn,^#2<ϛwQH fFTkìfM -u9<$nT꽣^?\ji,d:4w:H0sG)ǘG dżV躉~.}c !t%b$4!t8434cn.0.n=,yLy.izfXDNIޅJex2 #S#A1P:j°֔#YUtt3|J5.N%Y>L#ymJ^3ȩ3 h04N%E2܄gSo7[qm?q>HP i!~9:lf2$zJn1I+cܷylF@S^G9emFmfUI:;ǞLa`atպP͌P V7-,(8FALilS;Ȃ_/-=v߄I`gߝh;Y"x& bƍhHavztZΞ_fc>KLXPa03`$c$$G: ^ 1Fx,Rj-fd(E!yd쩉~eu!a>$jwh:+z$0éjs٨<ܸg DB1KI Cl3;;&25iK$ٝ.UK,d:ȳs_Gd_yR2bOj ]6Q!OYk씐Įx|qW'ɓ9O4)f= Dpts_cim<όi~n˨Pl>f=Sjl;ml8Pœ~ PF˖1b絤c}QɊFW]{FN9m6\7@,z&:螮| Ň͈p0\) Xϑ$ 60Bh{ zS:  L$7Ztvaƌafd_ih'GXI +~7 Ja< d$ )QCoa Xi kQӀPm RYԉ#e>5گ]HUB>f뮫Sm^6 CA+lnzl[={J`1@=߳~WbVE#b0tǙ"Op)Ӣx_.8̈́NLj4zؖ}!lxB%ḥc4n1i%<ⳏ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堦>BlzAC3?,v2CH!RsFthD!y|Ь~t- y`i9?o\.ɔ*R-EeemQ#4y=?Hɺ&fj9^=Ψk|k34I'4ק̬2qR04p?J9c; h43eJT>v@d}sM 8"|Xw6sJSńS pA0$aElHĠt=Ȝ>l\*Q`۷6Cn+o :"בu*rB\? TsI>iUxq6J2Nh9dҟY{5>:+IJ/%zV86%':GEq?ܦp >CUgE(70N6QFI>Nm4wu;ӚTݯU{ _{/׃R^{7xۆóٱy{dkϐw|a)amKXAђnRߙEA #\AqL{kUJE fvN357x;( ƐwgfEn.3kT&y~ xkZC؁@r~8]/ͺ1o|8kC)y >gL}3|nTw*W3z##NXPMmX4Gn 8Sc5"4Rͦ~sJ{ࣙ2%c ;QediπRԈGJQԡ xWCcܫ802؂̺f-wy](&FA Aj[bWz1(JpX 'dhڈz[{n󷍗OH +ϵξTƃB>j^π+rs p eʁOg@H*u2M+3t٬&Έf\iat>a!Me>d]؆2 zpv"te)ه&=ۈ!O@,&ϒ3t C>!xȬ 6)l!xB\c?s> ûS79^>n6 }Q#5UdLOYPH}cAQa6 G2urX!6b#2,uqߡJ(H] >;{NhwSqt8տRl@-Ay<|$bwȀ875uf0Ҷ5G?i̝x9ېq?W?bS7A\x⹈4ӧNP$$ l/wC5IcD-"8/V(`0K1RiOô" B0%/(Uc"}*6 IMޥ^sDCQlV> o0{W^#'>C I`z&[hqVpdžrZtj@ΟGPb毫i"N=]Mo q $ּO\޽E̍AiBlE׋OUϟqjs|qSĘo19F`Eu,gVVd{:I s bȋ*&{%|{llb![Y pNQl>7(2M,sgkxHvK&{4-RjI*nH 9)!a%94J&VvʔYm-i.I$q#c^r7Vg%cʮK;^T7X&Gã#יGgEd;E D|0-(hG!D(XM2*w;[AP5&[~LVG= K, @1'Kf%m a壮p- *\&"VWG`06>S۔J#WrYQ:4G;!y$BAeͩvVt( @0E:~b1m G+B=t%٦d 9mt+8kn 'ª7տtt?S_l>0WNV'ж.bY~^1 k(yK2fćI7ds!Kk3 tXaA%`B$<g5QA~ Q;wy|eM{\&\U@͌Я v{l9jxƊf z={|{JhZ,¾')y#|,r _`+&hhd%޲󦆖 h`3Q͞,&MlZ.sNg;Y & &_?e SC;HwB|UXF:,дOTRb[㴞)^vg=ǤT"^_Mi˫y pXB[ګE7=KMطe\/- L852K gޔ\ŴmLyN;w<"nqg*а)]fLݟ ,P446]{'p7Q9`\ZzhX?cŅT~@3q5^qiM붻~ܝR2^"=kəK=ω9 |_?V7ld7w w}C2I5 X`8'_M2(ͤ$:~f"`QXr&՟]q5-c1wD ?u5aiHjm0#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\ ݻtk.*$s![o@CuA.-p $ DBZIT>h f9(<29ʥج}(%g m٬ -ngR,FU&8nldzm'Ni0Ӑ.;\V0^-&p:#*6\ܾ}49!)= p5ᾉ4!3gCfPS 1+΄N2iNJqs*tl^v\%bųCiI.H 0iub&0Ij_'埳  <` +m/v c\nAR8UtŵH3ݞj! ѶakψIj#:3uOhS=7ႏ7S'ZtG5[]f0 ;M.W@>܄08B1PG_ N.aĀ;EԘ>1l)@|,ʣ`Tp%=<@jr v_3߯}ZT/}I>CX3}u7%h&0Դ~,fz4)`~5@hߺծo3ǝxLW$tZʆe²Tkvݑ6aOas@wjlpœCSz7L'gyYYMB//0fzy*H[!U\.+Cd+FŊB?n5tg Vߨ }Vi, W&:"_xq[i:x.7s2_K'lFő fmVbفc(mU2YO"BwiH"ziHV"3z%^V121fmG" Xzr" G* 꺛d0,|Tcd x -ƶ%^@(R`V\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,lQ@NE )\?e$2 I:{#gu4߫[uhk,xp_9RRD܇cYw_@F ڿ7d,(O)`F'kX0jF}H Z ~kW!USL+p?T#rC6cG8EϵT.A-]M} [7ET^\$*4o)Trz@}fKGm8с| hBtrP:*`sL$g!'6ʅūhy'1FhUo^yM$|%6႞Eʮ_zKʼ`.Cw,L}8mOb~@|+X59]hM4 Őq8-&܌,)c+A&8iRӞ֤Z jDudgtMJk8 OP8i[̄Ѣ̰',wa(c E3*SXX5QDѷ y=Dʿ=CUՔ$7]]Z*QYQ]Rז${I)KB`zن0-ڗ/,{NBUfג9Ur .@U6IhZUv)зW91FC [f8y,:U淄OhefOFbIL>dh[rbF.ΏdN؉yf=r$\fyJ% lX?i?`F@ftO]+bmAc+ژM7"} hY3˫(3< .szš4'Z'Spݪsh?ߋ3B%v6k]ZUas>㋾qZ*:UÔV`d>)(\-|$. ce#@|\f0_-գCyJ8y'FXt={]l<MI3.3%⫆m_gcڬE?d1a/;4~Ta{g<@4Vn?xgwFP@xWݱ"v=b֯g JS9*,$|6pIsCԴYە^R&JsG| NWjt,7%XծZط)JL#z6r6 ],F Ynx{-!B#u}"+U%ST.ge2T&ca7RyIF %mG-1~Uvx9 ) L| UDe}8-P\.#H6 fiu~ӓFaB xNeGq*~YHP@^q salVȈSU8w="oERNbGK l d8坞㐌%%# Shc6lȻžawy?h'g3bDwܠ%*ٷ:&bpi<ޅ,{9xޢ$_/f{65 m I-~dAiVesYi1Ɍ)E 2\R)07)A p{EЁˀ]UVȰpoDypiʞM" 1$S-6[ "G>N@S?Ɉ8q'}6"9,*fq$vh_C@Qf|(e%}|!& ge4Eo8;nw)ʠ{&bJ;Zt1qq9{1+FqcRAN&5o0}@Ul,pTSMB% NEDPĺ˺w\}ZX6zzӹOWEKUmajHuxE\0yu";{;ՠdžw#2= Nd?7IelVUNS7lYbO Sj^P3CsWpqqZˉcٙ.^-c[2 2Oo $L 9;N}Pj4x3J4YI7Z|<t{ `r? $r£G¤j zO+%Gdї?:f(1_Ԏ9/ R_3@cP;L8 D,a]/(: \o5##g68 mpaGͬRͫZPKG̒ڬ=`~FlIڷ^'>CYǃ {-JۊɡlMO~yT>l򁼈u":$eg;3x 1+Q}@h?F-kX,&\ckEԯmNQm㚲KoS;(Zib&PnyߟH`b-+Tky\[^nc+>#{06b5|T05bǂLmH&Jжr2+_f#+HKe򚡀4aa5^ŷ[ƱU\g@$mifMUapMX0 շkr*'krծ,Lj%m 3Vdg(Q+"ErCZF IĢHw51+E{7^ 5!V{%:>YaEV d".-$#[54BDB.OF H>FGHaNJ|Jv;unM1! y8Gh1h<6'~ObpEލNj$21NoY>ѡkm`^,5 qG%gU C]F. ibZBrHpyұG,ȭ>^40 E&s].`Z&ЌJ4\yl"Uڴ\n̤*p?ic1>p/Đt vܿi?.d~xKc?VdVXR g$6}ߤW# 5jŐ{b>$2yVԻO#-VdcxP ;G7LQ6w5Tdچ+Ybws"ʏR+w@nPz(yvGG%RemG |}w j bԃXE!}o-a7&z mv/Ĝ|(!)o {<%p L&Giؾ@Hd Ci~H7@Nݫq&Yz8a?] ffR GI;0r=3|7ڦ8Q}ZLSV:Ռ|jt(s_Vu,T>ZPAza$D"l9^HigXulo͗ 4H9UlRX4_Uû͇rA֯Z@e_xBHRЏA08I°|v77 ۻ鮷GQR >Cv~bKF1>̘0@ꞐhM+o 6@Cs!/ )? Pe:[/TQc嬝1YE,TvvtWpusU'twEZq<_JYN[09'nDP{Q}'B{D5=r/ΊK`NhvK ֟*׻yec+ ՛//&+/:j(2٭8GH_: etky ӞXM{LD9E,'u*$[ |CY~xn D.[(ӈҭq.m>!nXbώ}ӬW*^C6-&*L!.V#>w)ޒk gĩgN"mܺ!=*F<)]pSyY>~@Z9K!{k<]jh9:/ XI3 MkܓBc@U?]|2!a[}X$EG2tc{uko:WW>\Ƕnd/w䆬&m>RALFO3Em(l8[wAG.w]9ܥW]m 鷅VaHy E"_7&G&9[$&ϸY#]dxlNfx)i޴eK$CU&=+;}_=!P6{4ߚ=QkD-yZ?WM$Јnq]A w=#5&@4`r%#lL̍m]{DCtoKYoRar{s؍(oB<"]d^1/ܾ-h_y"Mt6/jόB5HzO{C$:3WLo mUWؽ"#WLf :iȤi;1nUULH r0ctO݌t R;hͮ;wIR\ hu?Kݏc Bz`:%hQ aQ8"͕`b uAo#d(xOߘ'.TOacsE'MX}>yajR97P,ļ!ӝ&Ԑj-kZf`Mb} IQ!6r8j 2uR`0YA>{ǢPcat_PyK1!!0,#p'0RMzQ;JwX!C̨MX~5FrAw0Ħ̬b !@MZ&`mfԍQΙ 5Wߞ)q9/Df x!nC/S.M̒SUZj[,u_K|\tTWVլ}">Cs~B&;?\BGXIn V0e;mI>8~5jxM1P?9j}rjE}yT&Đ$3. ,Z%EߝA_eBĬ L'#y/xJ(^u1DQ'γj5@-MxmiE=tCxV:x 6 m\kM'J6!z0J=l'\>dJ~lYp? 1rB(K2޺O6Mo_EYo9 r4V(l8{h G).a?&YPnQL;t>mf 8j#堁ߜFeͯm+,x 񐺭f$,,tOx VnJ4f٩ҾN%پ }f3^:2)Sh'!\6#;{N&ֲJZ.mFL7t^ne Qx nHތDf@r;x}Sf=dYg)fU=9zR}np聋$)uL= ^=tQNoU ܲ] R}2@x<-QI补T}o- C"{וq[)aAJ!ɱvCLf0$HZX1{lzni|hy ⭒_v`r kޕ9(GM !h@wSw/ #8ƩlE5 @oq!eG[l:Am5{1ti0_ibdؑuJb#]cRLzrʒ*,MX`ne]zNω?N`Tpp"K2LrVX\Xo`v{6dZv|)dyn$kNd3uDf$gFa F|::_ s_юQLx(dcߤ,c>`vv$C%k5LWiΡO*fs3AUw IS}^\5+ǻɬH% f3g)ll<J. nP:ŬiQN  0~o:W3A`WMCQ[>eKK:!eestD}VPW4QrZfq=uP8QӝEU =O\ ((?yhP>N cS 8X~2lH+*2=w"ep^񯀇l32= OjyQ ?Yb ~-poQJ4SR.2Qvf B,ՊC_u3LYgdi8ʙxoKIӖMu2c0:v4 ѕJLYj!"qԓWOE|Γ>n֭˶? WF,V_d WCnli3WQ:ϸAC(tYYl6vduqi޵,HJ,a?7h&.H)TT Ri)iDCouRv~xrmuK(لQ+>zpꢳ;І]:p)9fd;VT+r) bZ:v㠎ZUlq}%0A#4> <%nAK(\#K+kQ5H͏2+pNǒLs^{x֫דPSԥV0#F\ėe\ll%6^&yVh|Zqz\7C_PNf$52@xX)j|S﹞K+ M$]1VIHBe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=5wKV2+,LE,YP\jJ38@j̬$DOΦiiGي@=^= HOɖ&$ٰ>al炨fo. )Ha"ȲU>vylJaX؆a^R: :GlH0%),md/3 b }wFO-4~<ނT%ǯPb]z~b}րBiuB%CYzIYb{fTJ?z]\6|֣ +d2 %PgfdYN@-/Kwp-z/dCY~$_vΉ+_Mɞ4_%6QI㮄ťT5 -tZ*]BΡUϠbN0`6X^tXBkZ734vKZ뇩cԖLAڦ O'jK~H'ZU쳍D '][^{q9d1"p 3ѱ=?Nz,R z{ ޛ2ŴpvfQb,qOCN],nНč^L8:)'&QZI=;`k4C! ٬N9$Lx6TU ձ f%iE-9iW==7iL|n962fA6B]oP>^8䦛oplXsҳ  YMmxrq+"n%+NQJXKHjG:YpvqqZf\"BImR{UIY3EL.bmxrxPڂ'8+I? vr!YL/3KOLd!{kdǽ0C) _?cV~tJ ϒxNMTΘTN3+wFKs?D/v JPoӓx7Gm0(fT}HXA[^$XN`>,C^Z4W2kE=z`jq1_6Pgxn9*>2*NXʮԤYhµJsM{&[Kq#]0ki:J3 ЖxCQ53"ƥt3F\^By/FzXp(He*>5!*%,+>ģU;B[uiV6G r+KT57E 3ȁ@aZQpMwj uF[?j Sñ:yy6IŰyƈm N:c9&&,lQ\F mbHvZ͠oP kBvZ %ŜNy=e=u3\3?xMt%$|l۫T }뵊ݖ3"?묉R0DRc&!rGGMb,0,z?ijKf-Ԥ莃]Q[h_=c?Q'ࠥv)5GC;vs"YL1~,/mo1'n;5@>$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- %PQh䊠~ө`OVIK<&ZZ0½dZJ>&eHf*m7;2˔Xv}r0(Z|Lnƪ,X xx ^^:gDn…T$e1W:)sv(-u\?ȱ7T~Ԟd8IaRc]ȼΘ /M,Щe魨.׹P~-pp(w=𱲵NgڦB BU=wtH# 0ȌNص(cH+AHK2h[ d 9]:q詤:;kvCgGoljʜhB rL2k`V]L:E,zNvvR^faUK`j) q=YŲ#Y[%qy.*)p)/ Rz5T:oneb NUc><}MODP?Uw6ªgٓ zx/=<өuMYiq,*+EUCdi/>. B"VGyN|( X"6o\_*Cs}I$F@8Jwi,P? :0=7l,C?=:סiH;3-q]o[cg?4zk7e3PCԐ蒝..YT!+9mM#߳ӳ|>5M;gi<(֬'WM?FɒSbNSR]j ,]u1E6*VimCLZ󢷄uԎ8*zPU{%?9LJ: Ck| GY`ZsS:?':CN8iSzUD4}6Kॴi=vv-?c(Qzx̑@Y*Y 22Vr=}*RQ-S"e7GǿTP82rf5yR}oj𺎺5#zefkI5x)(x=qZMocDy+"ߵ-ʕ-&kNGPayiZ'ɱe3qk,ҟbVWu\rt.[APIY(#$sD~**zCBf4b62mMR!JQ"qi1E٢l*^‰lt)a9w|Nxz_E[swN” 4%[Ч R1_^$`0o0ݑYfk(*H'emeVxv KVub,KJr ۾P5VF"bjhXeL}wx)Yi`8jPv|ȷ9+]eAP#dNAwGFX]'4^!_yyKe)aoE3->)Nѿ!GI񥕝Y\ə[t] /2!fB9';O~hd y*H%D\.FK6L^nABWׇj0q휔,U&(rй㢮-{ 7*HhZ]_m*K<1wӭc!kcS2 mOLs(CWy'}DYe XX E=˞JľF{JrT:;KCu|t1#YKH mi>3*T+Cz,f EUm2^xNvFcGeX Z vT:U6QP`UL P}+( C7on -`|;Q̞[EC#)snu TUIxU`-}9(+YTvo*)A:'J7îq,/[J+OQ;[kNUZL'4] OIxolWB1p߅iTqSz\OBtPd#Cʙ`v`Nj6 )H~c(~:#Zp?Qu>Il%NB*Tj|ђ*l̠#JSsE6D6+†cEn:TI0ּ7 S5mY5BdHScF27.DžCAYwmY߅5U_8QrUցi[k~K'y)m7 Rr"y<*h\[b8)%"m3 `"[tOz%6kl dUBB iWhwQ~RY;E|U|ğ,Cqr8xSN:M"R SU -Si=s5ͯ٥/Z;aV8%}9Q>B9@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 (eauWcs%Vr%і+kxwuUY?j6*b4[1 mn?xQcY1I1Fn^6M+ԚB? M!<d/P("\T.hPʤN/? ߘ ʌIT^Խ,.l9.ŕVecZއݯP?;8{bXwWg$l77h=erTM0nqk Pl(ׇV(9?PK_ u6Ց  n=Mc(qۡ@k=w ڎ/vh>eCbBF~'m^:սٜBɵú mFXW1F-Ulgq/C\Q&a@;DǓ^2n=jkűQܒţiMTp1ܶ}$ǑH;/*嚞)S{-Whh?!nU`3 yüe*` 31^"w_Ǫk!~ŗQ/E GC7kݝ9̟%m>_(9wr|pĶ,JsgTnbe{ +⽹Jo,ٖBi:/%E4`@Tn* Ygn9NrbTnj\ART^/v'6O83\SJIVx\ RPLԭ""؛T*~Y*TFapR۷4Oi}NIL &Uopym&_f5@Љ'*.改Sfsf^\UKjzau s eu=zLBY(pm"w&;mP t+B:\wU L!1ϟhf}&UԦoÿd/eI#?[I*״)|PYL\OҞʬKQM pgoq+8eN4i͘-1ؔ%'OȮyD~Ke;%rְ|,:QxXF)tar6eRҥd%)6B@B)A꦳HWhcסB 2l!+]6DKưmjUzK1Uzk<?0t i A%bq%3,338͘ZCf垴ƕĕ?jOZOjfע/;jf e27k/͵]1^hfS½FoKTi.|~ WVHʤ$mrLʛoXr~ɲ6=RS3'y] 4ʃ= wj`2@jbMѲPSWW@bw>l)/ ]\e 3v`M$=M"乔%89]o^ul;^PI/a2WR3_O9s+x̲ӡ{$Ê<<̿@L.s5PxS_d{u`c_2Zsŏd{cXrBieGhVOIZKy92pn ٘[[К7)Cq$?uu|^@nͨJcD<l b.m1,n(*_Cemgʗ Q}MKs ! F'axT\C Uc7X~NIw%rLrL;-CIOLԾԵ?j /wV-GS14 C8mo5wkwY9cC$ ϪY)Օn,ghtPTrenӂ0R%BK+گJoe&ۥW iwlT?RW 8B , ~H<8ըMw(xn碓buW9puazU&/MMғ\^{/>; wqvHX"5po_] ff )G}>5YUE^~M6[۷^^) K9騶MrN1^ -[!80Ƨ"% PQ%-M,uߢZ ٍR IWj=q_E#U,!f/)eLT*ЊRz/:"!9KZ˭}YMn&\}4}kjlF\WĂj Ǫ*>6U6U}5HuW]**d|70}f+AQCU#H`=LQ5h~Yh5Bl֥D'AAL>Bp*W ߎ۱07X&xn= H~} UDFlG~ePQo0W^fqmߓy;zy)OY*Ԧr5ۻX6U*n?"s|]-$$eih;hR)KC`f"Ws!sC@*Zd'RHt!/S,DFhHk|qNOZ*#NWn̳*>:sɲkoK a{D@:^&|+SpKa krff;^W<\Q14@\f sJѹX0V n;Uz;DgCe@j"Ǔ,OQTi֛jpÐ Fʎ]*m:BR|߶(Rʀ!rBn/s:< _ҷaᾌ-*sĀ|~lM]{SX1f[gznQT sB>Q_X3>W_('AA| oo8 {bF ^3AX%\]L^771/:p H&ފ]n(j7BT&>-]ѫÿ Ļ9A`z7Qe(j T U¬P]\̗\/lgd')3qgݩZ?yyµQ aúN8/=A@'cnZv"LU,ug \SJ59qUs&(@ Um!C2ٳJW $mu[2ZNug@uU*%Tˆp>O;yJԭ LqK7U2i^ W=)(CD1VUz/g,Ee#I¾RK>Y)u`>hb׎Dgc7980Sgڶyà_kGקU*5/Ǚ aC:ZXqSe?YN"9PFUH \ 'qLѪ(綴M SC9c ~t>"]Р6e.KgZyn/PeܿkIxdB%΅qG2r&׻;k>~MT7T,RԬOU 5v%\QEES '9*x}<ڞ z]m*C(v @a`T.xsd{Q\~cU΍q֜oz|KBxoUg>N,,VUEӝ U X}UэrgR&?+o}5`Sd(̊ƒY.du:p:{ta-[EAf\K2z/ކ=/3@Y19 KTO=nq@~kOyǃD^! /qz CH*`pjKU,&;[g)KWP1& 4qh >SȜ@jPXƑtwWp>:n;9_yhBYC"gWϭzfe#GUU׆]o!!/ KVҕqa-fjyV:? =lvR\f+̱R$>y}v *j QU$_2GSuʕ L2WJ v T ͮKymTԵI^}mC[;?* YKWd͗oks-Njg _paΩ}1a"2Vh]{K}`߭=P*eeufO_\  RHQAm=sXj];9/2\1\r+5/^N5 Eǥ Q7 tPW>V^M(CQostN1T֒ Fx SJY!DBƎvTҋB4b* g9e컄t\\;@6LI`UY%kTti&{ԧd1;f $"oh], ]ۣȈL\DQȚ(*k(,]Vj Uj6B yF@-_Eqd f lٿOO^rH ˊd05VG4 <F^T# Ϧ\Y9ilՆ3l:!^ˉ,xH#@Yfpl=Lx<,GvA 1G}WڸiQP4k+ƽ-P[,ӻTCUD`?g>^&1$jt0NBVU@; -Yv1|(fȽ>FxX7PQOtkHN14g'(Nʻ䢬R!ݦ#4ZNgQ4: jDk5{eUk-Eq6;hhGə ,Vxa'_3'MQ udf>ӧ֗s,aB0%Hz,v+٠m\D'cUN٫<ј@zL^y*d_^Nxà-Y ,'i!9%m) ͥSWx5{FeNJN9&"grLÔ m0"Q0<7dRS!cW LhdvOHPl el3 6]21w]lk̪pC_`+VPuq49o@ϞϠ!wqn$ji|ݯG eo6 k#O°HD jVEO+ ҋUNà4}i(.^6#O% IU i֏ t:BPXFX XuH#ѳ k BWj,daIaae Lb0p@\ɂt ]dmwǭ }ZYVo.@s$xǼ $!;?Lu\C ӪhgڽQqDVKW>SFb(:/:K, ,Chz:C6ݸv~Vc9C2ݍٵAD5*‹uIFL 1V R~dULT:/~M95}x^ʕYl{i \݄Ɔ914 Jٌ}mu^{j @up,N iwAzbXM6>ߤnJq\It~'Ό ! [&0'o. yVsr ·+X~rC[3yGSв\ى'$]~j^~UD}HcIƅs$&z%L_$ʩ9heG"Nuv͇ ML7 D5g>ˑ|d"A/!a$r1Q%_B%%Jt&_`QuU+~ m_\# Lxh݈Ѐj1 J8y•Uqi.j/3_xYz+ݿwwa= C:{72JΚ7:Hy:iCr3pA[^b O4z =B!p@LƓjPAeЃJh+x'E2Ǫ"%p'VM(]cQI=HX|7rGUqi5{y tŗ]RS ؈dn$.WnT ߪ A|ftp80V(4 z-?_-#5<ٷdҽ $ҌҺL$;2"C% "ݯFXJ ٮqoNn' |{쳖:X|yY2TJ<γZpC#r `;H#8@z3$Z=z}Ԙ4s3}^ 6LiӘ4eoyot7" 4i("[lS;472ZfeV CD/ku%/:%/aF6/!2Zx yn,g3lblMp,䔂f-eOϻI~ܕYZe* K&,z +v|sɧ!L ϵQ6=0t޿"E<MyWHv'F}{z*v54  {֏cx7sClhxQPM|6I :,Jأ(0aAǓ*B<7w,hOwqc9^/: 4bA79LeD^BzROsQЂ1#XUL|D@?'i6ǙE^:8d ް@J{˦f! AX?!SCKrh! w-7F/abȾ8 ô%ډZ"|qS{Yc0͊ K6Z>F>-ͦ@]FSM T}@ǩ +[継9{(=ngp? Xi'xXuH*s\b-cۍV6'fG[6s},=nr+B_18%X6c#ټir[h>E>oF4k|C%k2!@D%a 7 SNrl "gw4~;=lJZŞcju|?ܨ? +P] *HrgǦcýpvWBZU/|G@ 0B)$G񯏡ma,Zmcaj|z㹅o oYt*ƃʁZk0R ZUemfWȴx 9K) j&~/m|̱(`{V2Om/w7}2_>y.ٚ+uk!r(P0ՃCɭ"h'(qktd*Na{&rC>=n`!&[قX޹fmn;h? TSTXЮW!y%i/pPQbRLեrޡZop-c7 Y脻  i/{1YAjWДcXB1[9nlВO7TFec*H#M9q>ꓗSގkHV^X&tgԉ -GwggSנMXw[{Q aQVձ8;D5TL -G,(2%^@ȴ*6Ö!p-` #;=( اhy>%j?˭u' wSU-GeQTmSW Uh`ynjJ]F1B1 #4`:DQmg8 ԯhV$]턗5ՈDž9ܹHиjGɷ=0o>$xp(mG)mkWxђhꬪ,'\ Zu\vh*nΝ.osW7ԵT&@6[E?ָ~YϱlJi^M넍=7{@,=OQo1 PhPU)I+?8/ jͧoQlge\B:.`( :Q~rQTǐ>āAM] ղZhgbrF{BrP*%_ԄPo `(>hlQdyc|]^Ji (k(fi`^7b^ū0mыw+:GmӮnm_qu4} *AR4y8j/J8(gWrަIUN E?NF'q2Y:g*z<猛>cPL;pj@ #x \l 5'f+ ऺU -,PɓZ R=CӮ)dƜ5vT'8bn..5A>Y2#Qͱ3*3薦৴F߭i;ԴK@e)Y%(,uIly3wZ@< qL!nFfP>w^-UUL/RqE:Kvط.'%p5{f['DZgeX ܐQ7<6lms[4}ie.DQ\I)J[vP|\ʌfo ezƲj oyp.J~;EVxP>nFG kT @NFm{ԭn=M0$vZEUҶ(PK]v5k#rFY ;(:>Gr$ `(g_)=ýrltO؉x#T@5{ ]Tf%aFmJsq#xF/y #]4+T eXai%Ek?9OS^O_Jy/SŤ'w( %%>i$I9'*],1r4laN8c]^(̀kt=;|ịv%ep} U4Sz궚N|ь#Gɼaw6٬[!LB$+p=J}2ݮ&0H*vqR&c&`mӥ%/N EVÄ n14Efq;֖UғyI,-pv +wҹSQ. 7-BZw~챘ӕ PFh4LbaT7$l8,}1ݎ:s _tψϨ3ynkC6HSlV$Y8%&dYJ2 4QZ` b%``(K &#H̐`mۤ(~L-cAħ{ s!a^R<- %$KN%^YڟKv I¿lj:C~(4z^tۄLof @QPGYcht7a C Spƪުt}[;f#< 5YŴkJ덉纲=viڎQ)!&IJgl;7'+!t m=!T*z/ŴGoʆjY2rڸ\.poj߮_>]کBUSNs((6*?!=T O=uqJgUaKLt3fO?c^ݭON8 3 _osfJm; j0I *Ő2 H{]pH-&XjZ#// oL?zOE%cc7sƏ3=(IrW6j,Z1Ni( j;3 p=#AzLYa;\ |?{pO׾2j~ɆhL$(:5˻0}EOBnߦuYZ仯&li+w#ȚsՐ\mz=uFfx8R.RF'@W͖}BO[8e><)P-)ƣL@cfy|S[!wњֶ"W(uRdՌb(|; T?NKZ\.lq{cBAu>Ƙӧ#AZ+i~7pIu 6KPTXV`׆@k%k"U:d1UCyHIݳ%g7*R HV}at ۜ|X,:bif6lG8bIOot1#X1AF <ܭL(x깎CPQqȪ5jU7^zOPFB63<76CD=@T/N/Df=vSCH󢨍: %_z蒓j=PD+8"-[nb{\\ٍ3S9 SyncVhgcO@9kk҅e+,\X)V13P*!׌Ѿ?ձ%]'z~SRa*'WEhg.9%ʡ NP>:^9^ Vsu^N{8KVY f]|P0yRU?_p%tqd Qu F57s&rI<Qf)bO endstream endobj 1309 0 obj << /Type /ObjStm /N 100 /First 978 /Length 2632 /Filter /FlateDecode >> stream xZmo_o (N;/I[-ҺH}vWo"]gg^H6* %Q^O1hrtF >qfB% $ kӠ6ڈ@]Z 7H)q`C5sFǑ<'8fO#fd)bGCsi)`-JfSbB.2gwAr 1AI 12,@9;a~`j\#aB9 I%{Z):%a)&ȀaMka]yxa]taV8EynX% YXEs [R98\J"-dXZ"HGxFCT)HET *c \s@a1<amŭS1jH ;I1UV$ò%20$@L,zH^xIe;-#*S Z-ǒ (+&*ru, w˃nKQ^|UyPr^胟νrX/Eqz:l:~,+q.c5y8O*?yPL/93_i\A}9(>s)Ho}BìGQL>MDq$}]MKIbjsk]Y 4V*K.77I&c7Q(}4$3#pd<_c80,^h};zt9'?y%pP'U?8nw|x&MzO% v(ՌsDCm6$l$O 嫼" h7'\8R$,s/6=gv8.= ✿;OL,c Py)+TK\& $G= Pz#<ɤO8C*.{OB٨$WFYp4VTN eX$$rFxzIQ o36tw)ii`hfmft= B.V͂/X/&5tS8̪p:DBa*M#џIa峋d^(I@~rӨ.s/*Yj?N'd: gr4.7M~5oŇW~p:\1xTgAy2g MgAnpm袺b?Xx8/[ߙ=|+uszkQ6NG揲epS.߫6!zp9 rxܾ-GW,08ף@PP*o~!`f>81?gsy~\u'.{d v*0p<=v}++]&_5`w tbsel)tAq5#ƻ_]kÆ[-C'R/6d8Z2^!k2uY jChEjۥt*XN( Ӣxbܻ'VoY/j>n6K~-q^]6jaΧ4'#2j`h{עln>I I&C|!Ǟo^]N^e^ѵQ3 V 0<7r$RVMP]R||` ԛq/Z"n F"y}n 6BCs/>n{;g;E!#C} SPGFMkXEnzv$88K$2.O̒)Z=llQ\^Z bς/Pxe =$ֺƑuq=.B=|/PTJ0.NJ?hPMUhZCF |~"9hSqҏlcx!F9AIyaXӧY d8G'J'%fAÅCT|A?A'h [EBz l\5bju5 피֖&dN_*ILZ#W)\۵I-!Hu0Ww#kMh?,ZʂpݭH?ZJKV? {agWXrRzEm'K[aIsmBi3MZzOVV_?KY ;^Y^1!Qe$ Bty#Qv҇&kXVȎv[d> E|s@pQq7+7Ӳ<.o^b?fjʪs?t9)oN}OI%_^].b2C endstream endobj 1431 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1221 >> stream xSmLSW>Xw ꢀ*b!+E 0 2Jb8]D%a-NQ`L4nۡq,b|/9]۹d~99}>s$! &[L*JE!2q6)`蘰(f#GSEMH!@RAkŽiHN#sy #6UmUVl:_{O6UWVXWySd\gXyo4Ul6UC@MoPxik|\HPG( !bh" $G&t:h,l'wH79'lu@S snp:G>VnNP9{f,a8Y0n,Kgibˡ=Ax%Y..V '}bX1&#qxn}ln޽ái -pu^:V/Աjv$q76adžA$MN'qvچHhR kyAa=Bjqa" g`l~;M̖I d.\)BD>^ow"?6cbRh x!H&Qj\k>#ܨZ^Ҟw,ER6eL>HbT76qugB(Ϗ-Nكff% _k \^5[ .sl{iiJ bq 8Q` /N8aI$c|2*G HWZpӮ-%T}Vݦ̹kvI136aG>!;--P7/$G]05,#!AXa*1ܺT[~nev;:Z=kL!ړ߄[ٲ#)1̈iGޮn_bNUP5;*'q}MB7Rʠ% LmN>/+LF!KoNkQaE=:igەuqp0yYt38M5Ltw+Jx% pxw$8'!{3gRņOXrN<0x(`*Bs= endstream endobj 1435 0 obj << /Length 3127 /Filter /FlateDecode >> stream xv_>D `:N";mWaKXA@QrN3;"=}ٹ wr=q'}5 '9|9|""̓OSO~\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 ǔPtNJqN?( 3`n[gǑ azT;pYg8Z_hDL#;hANΝ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`h]8@B`ǰo!;eޝ:&:u]׵& lnd]Ĵ5ʸŦ,2]aqne [0**dϞ^P#9Pu8-2Tsv mj@ 12;pc&Z?$!}2:HѳX 6 K4x >Z#] fAcجtrn١ K`=?[ ;_7=}mDFXljL*N Ks5 T/zM )R=~"uqrVmqnt s:܎X8pҴms!5rB322m7b(f0%(Pl\{ MEX=B . kgs( E',&>SbCB'/10%=突DHl Ux= z Bx}'촾Zu֡ "k~1>B|g߰7y3\R4]F\7-{Tcb6cGNSslk5+t#V1B[9 MUE=u!sB ʥ5K;fד=( Ǚσ@Gjb{\8qXN:xf :9Շ  c P ٍfB͇z^u%=9+v>+T0f8v[YqMoޤ%mhͽ ΁͔zc}eio%H wt ׺BL)UsMS1amu}4NXC/ ǿyh4k͌uj7*#D+{1,Ɛ7Cv0Ŷpv`5͚{\c0HYx%e{]̓PEQO~S褷I őVa #>g9ּ" DpߺVƤ2_7CEAe:[F"4D(쯞d{'Qr=^[I;;>wϴqS+D#UmuA7r9LMchnQw"#g2}yu->~ rү"&t\b,pޤd ሰ!كl{v{Oh1ŴaU= Yj3OsOt=g.??3)tvm;axLs15FS/QUnE}&d~J?y3 Sd?b]g %lt)āzg͛8۪Gp??GRC/Wfuњ)xs>mA'"?=FmiGc ήĦ x:oCܥ(rOMk> stream xYKs`V qjI*vlV|u! hԣ\IXq_Ո>vJp>A G(0Tf4[NJ 6FLwz~;Eݍt`rHD?ï8'(fO֌f4Sڳ}c &)&{$gWZvx{~O!I˺muy2-ĹT<좻8n8;#_L fkj|A85J&I}!mYu~sIT5J\X6ȟ}L浛KO@m+=Z|{,_CE,V{ 9A_B?tGJ0(]^YE$ 5^zs I^cNpZL E8mD96ɊV9kHTwZ)4)d^Jq8h}O!.7Q'gkhW{ ųBBFC ߆#W,w7ӍibM3۞+SG;iuذXWC"sx?M"9F8 4:YqB bI0qL4йɠ# b|]<+*σ͋Յo"!]z9n'2?ѧ:ECױcO&%Jb0Tgy?O}Nv2"{Z-}\ؒX$tV=,pt 8F}9tW1a/mYeMF ΄\ aL)ozr0y* )О B`;IX%O8Wh:NS*j7jN O& 5xA'wFݸ04fV{j--{2,m.m&[MQ!29}043[U>-ir E'G|d5L|C3jwK씆[*WfOvn0& + B G*Gf3GdŃ$mmkU5-[.ѩ>)<]岟²}wOZdw]0߼.GH~t"y>٦ZoY5.^aQ8G+{odl%5䢬{ _ #cmoGî'^ږ4E k2Z 4krr9$M{:j<@y>/Q $,|ז܏Ζ< w$ZP.̗nn۔FBpQxAk+=9$‡} ]GB*`~zת"y]sJ'p_]*wGD}}Q)sկKf"zd{%?O/y^Q{tD5Eh" =5`[Qj):$n T_kWo@ǨK&QGȏA{O~J3NOǖD蟤y _Jk?'?vhw_ce;5P*+SW8DzUV&I\@Eb9T:3cZs'S< UjœܗBK=0®Jk=*RT(WTG(ȱ9jqL+Wz^ c}T|ٌ ev.`6-jȴtxjxӳkdnseJ*9T ['A_Co|YIτfk2(qCMP3`eNFh aFexJվ sJ|Rݾ"/¥p?"P –ʫ> stream xZKsFWrxĥRlyS)GU0]PВvkL^Pd\vN~~$,&tW^ c('W& $&%\|[W*Jd\pKTo^run #Aqyջ5>D{_^j>^?j™}yJ§1B7y;!˻.,6Bi-^X l4ڳu^g}jM4ZoQ[%"uWl5 rKU]G2ʮMmіܓbs/v3gMU2U23Ka^I"[9R BYImU49.G5cQFE7Uy޲J15ۼA"9"(fZd ELtaSf ^& HUD|2Zx^r 7b%dK2/l8J7UYohQz  nPr5ƮH!2_-2]ex z (iIoZUQiJ PkP2Hʦ)=TA-uTZ^G-k/)ہGucXNlԪ I"H~&۳X5rj6v*0dk`3ƉU8yرӔavw6ʿYFe5ϡTpR@ p9q6dIse|"@"5'tH;l<΄ {.q)Z64UY |SnK\^[\m*b&h nJ|il[F%>:10>ف]&* 6jȆp -ҥ=ޠ£_`D)7dPjU6i+rh tm%bZBBʵ e 9pAe)Q&9ƲS ;ƵHHmC&FGY'9^46bm iV!fL '4h[ a4΃x @ƻ$^Ă@s,jjVEW 'c5 joY:izDۀj2lwEtP:%qBDž_3w^@uֶY - b\e݄|)ӓAPT(awXl#Եy1cx Ha{l !n[lK0J%FmZD'ç(| jt׹M1M!ZxrHP׾;9~+6 & L $VkzVz k+MP:eo _BI OIwLnB͸QA3\A.\bs0۩ 8׸jg}XlZ2KoYg$ _s1l3?9P}XwGxrҗT=#b ;@Yx@nF&SZ5T&h'%#sAm7Yj"z9$^vT>),*\6a:pVnOK{D+Ŧg?Ar`wl|eu.sBcߝ=}sgy`ʮ#Hף_z$c&Lچ4;$ޱOZ$$NHXBL?8I`e^ n=*_Z=*3od# PZ9(irճ4S+ endstream endobj 1454 0 obj << /Length 2135 /Filter /FlateDecode >> stream xYoܸ_'mmD.> %Cܢ@.mJ{Gr(dZ$W(9g~3.>=t/n/d.z@NLX2d˔WP$x%o?~xWnY'29^(T,X& tQqXIy/ĊjcEY$/?x 8LzIIjeÝ,CeAU]k; dߟMqѵ~M o0Bp{YA݂F}n NN&$a;KE';pUm:Ű5?5a%À,HŸE]C8-_KBwW}Aac-;-_-ϼ*<b(yK\wXot"HB]"IBR~WEF0SHOAe4EVY9wQoЗ?*SB$+`iken”L$Qc Lۺmn)`EiF#ISC5+UX(Jb5뇐AAת~ġUUMkaZk$rpSVI4t`ܭ/ԵsnPlqFH< o$kY#Vuat x굮ϝw^:V8cz-Li|^'VU]fAK`|Dxf`j:Ik ڟ0 uu[ ~ث΅\ؚN}v`/%9rT7$.e6v:U~$|4sb5>0 I'hMCqwi-X ZWu){u\qG4gBYT[nC ݞ"/w<苡H$L"X]!DOn{k]6`zۂ:֐5]^9 RE֭qˎq ai>h_,P$ ~iPV-vF.!wg~ܝ&\X޸"ͮ Yspd\0\nt^.$C8ӓ!D#tT1 ~͘3Y9xF>F1vrXM&TpCӦڟ\%([{$"Eb=8H$z[UQNN,N0f6;XɋB!=ܭ=?#}y?lk^3'O"L HvcAZ/]\\EBB%Գ__f/Db Hk ᬶK$R|j Ǧ/e' !y#,͓q6_c  "0 shP|r4(?6#NhcwL6~+n{ʾ칪ʂ!ks_ Fq6 oqx(+*V@1, B~*G\V>urN\ 1nF,N7LmPIUXOXNf4]DQwU'oyUV>mn8(s endstream endobj 1450 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/heatexTh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1459 0 R /BBox [0 0 422 422] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1460 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 1451 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/heatex.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1461 0 R /BBox [0 0 420 433] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1462 0 R >>/Font << /R8 1463 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 1465 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1682 >> stream xTkPTGܹ*`zyΝZ@@@4<4ʫ@p C2:⫒4ТъB.1-HQAa$;qqJvϥ"ڿ}=NSHj(i v͞GJpJpÔ^EU?[JI:' a[HJQQNXNNnq^VFf' @Xۍr6?+#["n\6`s~{a2.-;_Tk3 uiy_W!Fiu>V|x! (E# -FEv9%h!Z,2(]BJJKޖ]uAS0$xQMF1J #di,WI Ʈ[pKzXax[ %l!R^$V!oG[zް"uHJڵa\PUIՑff5}X n;Rڝ9s١q^Sv|b5;#pb$W(jאn92n*" _3&W݉8l[C#TCfJϭяo +6#TH]܇Gd:-nGg*s?З&0Z.0-'/̢GwڜKaݘ֧89 W/O18sx_^An$Dj{z~MgO4T2odAP Qi8Y_wuȩ "%!$,Gps:|WeWAD(f ҲR8ȁ~ NpR"7l!+ U3zMnf3ikt'&v 98|wzLw}䅊o`f_OQwqO ?LV:70ljc{`d)~5ɝKxѧ;w7-sB˘3.ӻ^8@Dk?Q\MkG}/f $F1sɎMaZd_/Bj> stream xYsݿ/jS'llml;IhXSC^Kv6}~쫻߰b˭s…gͬmM~ @Q;)B}ǻ뛉#g 2q|ﯯn>|~5߯:D^|DH˧I "lgԎ0YevU$QӨJ ~LqiH̙ %z=qϼav*56j%ƅX+ixu"_J] &lH{1r*N<&YKn$pOxJmU\..[^,ʼ r V1S(qO1\v?e\"wGJeJҨ }]Ksgc1a6E'8͋|eč52lC!)I<ѳ"qq6drשʽV#) uK jrQwVSx@ a T$Z]^I I(DxZ |> xerBxrB;qk'mٷˋ UbS=^5>2? ٜ*-v ^Cӭqʺ!}9#9Qv: OV#)q }އ>Bf.HȔ2_ ![/(*ŶxqDϋq$UW[QF`T2r 89q(dH ODL}5"JeyXwyD6jOMA=([)} L7"ьʌ"YP4% RV:Y'i*56\,lu<:f_0ce]k3q$P7Xbʴ(1ʥ`geVtm6ZDEeR5*' ֨OџYs|џғHާLEƏ$Ejˮ~:cqO+܃q:Gj#X425JWJZgfF"7;j o "]9c XH(WH1JG77ӑ]=@\8Ԥq-npeY+ZT.)Ǒaf<2H . >a!l4/ 2OkӋ b!4]YT}\.HYMH}6XشOxYpQO=*ɒ*ұD[rc5sp/մKpRV x]nxޠA51@f؟prXv%7'F y niJ0;X1TA7b n֒=bނ!GqP~,J.,B,:hZiJg$ C AHTw0 $sGa2^bGTbe)Ѻ"d~+"UH?sе~Sd&Q8&%@ O0iiըM.%Ta/GC:aҹē&h" $Mj5sM+tVi#1>=3@ *l({CלT~wnW2{ީYn94h[uJנɳ(ƯFߚm݂JLnWJcG[>G)/Y FmՊ۷y"7W 4Ň1|X;( ^iU$T5rS48Wz%TbaamAMQy9ZSPzK5{g֍=Xo 27E^#Pϓ<ĨUzgуoh0'q0>> stream xZ[s6~ϯIJ D3ۤm6}p@K͉D*){^E]:i[Cùtp5Fe &cpP;-_6H^j.' ߟLGaYYH$$ G/}y^[s8{ǹȏDIII C@6 ?PIGE0L{bP;F}T(<3˞Շ˯)$qy_v[o!]V@`>o Ǜd & 8ɪMQ/X;A+$qW2LS$_$ &n.}P8ɉ(k^T F-C1zg'0e 網*=zBדmawʁ(C4ũ6Gj:ϾΏ#jepվԁȲe$}m=B]Fn(2{Lj/AavkaD61߅|m |v0HCHb*/@->3usf"k1܂Hmm%hJ^r3lTc+HaCӟ\ڲNe㝋vjEIl ]h"ד{0N2S8HXztٵ^'Jқp `u\ʐB\ځpBPR]b)r(0ZpaM77Yz/|н37WvĽaj DRZ8k-e CpR>.3QWI`ZmHF%Ql}Vs:9^`[.MsA`%Aɽ84S.cE7.2SM xDC\jM`z/|אt j75NgzH4*Ys$A,=z4p#lIФUiwJ6=H9 *$3A\]V…YY-`avEmeOC܌vvl>)ĕwr'/T"R,ݗO^n|!vpwr:x 󄬻0NJsv8ޑ&O\7EcT ,g㳜Wj0TjeDI+OsRH랟yzXϋSޙy/"02߷*z>a=qQc'$ZM}>Ưß.qgig`%i9@yx1SNL70qS5Ifqŧ!d2f 7V m^ѴG!3M%F:gQ[2FV ;!oHv Ϭ܀憭dh~ w)Hꬿ3+\a+żZ}>G7oOǛ4Kp%~z{vl; ߏGcOdV*)a!sTSD/zuO<tfݦ<,^b0^,1`8UGԨc[ƺ]$p&E.-$q8/?0]Xqs3yUāQ_q{ZaPg kQS MS!aKaE7ii!iln@cׅynoڴ@‚paZ^oՕm,Lzt C"5B9&1f[e#ӏ03^l،U)HYms95Π_)NjIb;![pt C!s#J;al`p@ޘ<_/@D( 3,4ZAfPwm SM=bfMmu:K'Ǡ$dz~Ϻ@ ^QSw2y/́`^Srz2yk8`0k 2%&vd1Mh@7Gg y`{[}y(-XaG7C-{o1l F uE8p$*o Ea[ndփ*6-ގu,@y2̭'Q, ;s,m{dg=`VVIODc?t@ 1ĥ2كO66gG`9gVgt`aopIW,#k>mWz)|[zݹ:Fs,jT+d Kl7>6@i|ɆPh9v@;f 9Fxv@h[9w)7uܿȂ!;Э zϓح$Z8>d~;mAn 2ʲ}f}مoNQ\t>m|լ<0 fn©\E·@GB܇ժ?P.@7\z5 &@A{m L#|இ1^hv0"x4)\6ѧ=~(m\N|k*Iݭֲ8uNajӼDt?TKw;n9kGǛ ޛ aN@] 5 @yg`cn=c.rV70INɐ8Kz)fګYZ656&(9j,z8c搃:U ծ endstream endobj 1489 0 obj << /Length 2491 /Filter /FlateDecode >> stream xZms_ɗyW`3uZNɸ 'EAB!AYj|w @DЦ3L',}v@4x}HF@@'1" F}я EiS NI_߼|7 BAz˫?_pyz9:a0Q11)L'KyTn`I_KJWq3ݠ]%4RX^e7U D `/zEU6/^.nLbf%^y8 e67r[IȖ7v<[ ;*n/x+ľxg`C%ix{` :`HerƹTMjոLTQAR8&R%|\9?k(90ON4 _~Bp8ΪK+f"hhPFDohFo9YӐKSY7 \\EF?$/֩,-Nzu6 3nnWu.[WuĶP.!!Ez/$_iH'4ھ{rmod8 h 4)Ps-5~$;QsjC[U-ua.7~R T|?ٛ\]]ݸPzG:P/l 1h09ڝ""l7t :6JFȇ&f{@?`8hܾ?λ"L0X9\|rx #30b"m=\@Iw mqg49M-/2/2i "v0o!a5pqg<ܪ%vQXwc4v("zǑj&A>́PtPmG>2>V%G;xѼHBLЀ׹ pCwMON[Qy{+\c_jEw^6A7;+ĂD ;J+"gpЍ%,t( ΦuS{t aT5nN~]ҚWfI>>> /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 1477 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/eigen.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1494 0 R /BBox [0 0 468 459] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1495 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 1501 0 obj << /Length 2475 /Filter /FlateDecode >> stream xڽYݓ۶}j ilj;39_hwT"n{vP)/"H,B4Ih߯Ξb&^&ϑm)\hȒ+\?FY2E;HI$݀+ٸ V4kaq  3ODtfytլD۪-:g/nҍYOXLY9UyWE~B{7-[բˢuo3n4$lX@d&ы, KŪ7 V?t^6m9Zו˻IAu?M5U =>]7\xղ\!>P&{Pm]V32/_!9}xYY/R`sZ!bMFr^UwmcʹΊzƫwzU 2W0 HUjÇB05WO30.;Bő(hY("DM#dp pu3EN2kq̖g?d$_,5""ywK]QU 79Qb)$8m<ʌ&%#&=y <$ _}z<95YE4N~ʿ #DO8nY~BQ] ?OX7&D3=y׏X/ҋ'j+_6?.(@nj mw GW;!\=R u5QP>JDͿM417D+=jV.9O×ڽ6Uݬ[_,><|Bn33&p 9ڤH#i Txz eYm1Ky.p7>6[v@F {Z1'S4_yu!Ieeusk 9&(g=^Bbi<]Wp)F!d2({(QRn;'~,E2/!L/☻/Uw#Ϊv^X, orUMW) N-We^"FQG`=y[z6[S , ~ۻjtOm&VnQͪ(8 ѿ'=)" $F^81 9N3|/NW5zMZH6b0⬱8tH6)oVn /0M~O B˺R[;[f 3@1w-lP,D7fTprt1ͷ5*Eكo=cZz.8WD ǪwIFm.sfؔŴhb b7`g ,3{F$$2 IA`&P =:a\i2 ~=خBG66E 2dryĚ7Pq`z; qf;#Qм!orn'jC9@ =4h6ՐypXv!F'|{˳9O96R` .'2E?D8 SJ㝯hRh\Ѡ"U oļ%Y :е:751}Кi6SAƠMeYLK- ^Sdq6UQ` _?FӁq'.8,>v2h!e4P{P#;r/g[i J.SWxn`ˤݧWBh,WU}30,78,3K:v:!L}þsFx|pfn%; ]\Uz۴ՃS Bܝp]|Z~H]vO.pt)x%荞£"GO}tO =%Xg'`>{iiʎk(C\Z?\qnmO4~/܃7(8  3ҵ Ϳ5MI6q(vxt8zG7&  r`zG-ADat~$`B@ʱNr>]ԑ]O;ߔ|LdЖh>sa[DE Ũ+f]"![ tx;Fc r)wrP!`bR-U` l`l!bl(bq'H~Tj*%UI-ƠQ rW'c T5?f4A {Z Уū,#$wON1Mx-ծsl'N9 rǂ GwF1)3m endstream endobj 1497 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/thermic.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1505 0 R /BBox [0 0 468 459] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1506 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 1498 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/thermicvst.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1507 0 R /BBox [0 0 360 252] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1508 0 R >>/Font << /R8 1509 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 1511 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1725 >> stream xTiPTW~^ IbY)piY B2tB#!QF+IiDb"h"Hm{!GK29fhTTι}߄ IrBP'ɗ#G֚dmLu<^<#dgVbS)FkP&'I7Y"B>:{xxHK_H*rS3|2+[TKW%J䙹R4T.z_ IɊtmۥ[" { — }9aA!IM7sG d4jbn$dgw\7ӂp %b&+FC_NG>.;f3>9\Q)q]w^FM!ѱSGK zIxZdvsV=\ثG%' De~Q+~Ѭ_'fvĹU%QԤ ZDfEKD(-(*:|2e,Awu]t](;GǠu20Q+ݽM 1T^:S2cOX1fsc5v w|{` 㣰B&< ߋ(Qx,{3Cm{*$6H Z=t,xQŸaZwXW1 u ];"1~%5zV} ψk l# 8ʠOڋZҧ=츚p»fT7*76E5Ym.|*d߽?'\KPIi2n jrHu!o*~34]WQF\SPR(o+d> F 9;䬘/&9γ3RNH?_Tl'f#+M4C {={brb9oLXu"|!1byh'wye,i&#v@ؒh8~/N G=qqm} yknnEh* > stream xr8_Wfk}"%J{@wOE:ѳW,0FB僋~.tt' ' //ǂ{ ñqً޼ь>}/zN{D-"X< BZ\e24ӕ3;tÙi̢¼WԌχ[&eHb55c8vo(Urm"0\ha  ?3IdRMi\LrUƿFef,O9se:q93 lO >Ss55>(c3 jQXxu!C"V7-.[l]Dnͫ\Wj~|5XRAyUܧHXum/vJH\**+lG\ HNŅW@v~ ^TMj(#">l 1'-$K1vT)\5Hpu7+E(g@ C.O&p.VuA1Pk^+c!Vg"D>3@yV:y{,>&aJo0I2rl<[^L''DY%vS/,YW*9\m*[Lm]VK= m>*JTBk$}MPDөKS/ ,0dpt {7mjbكcEk:$6Ny5 (4K$>X\A;7s"]rĬeDhB>D!|̏>~)} dolo ';%0;e0INY#ݘTc+ D\>q9oCkg(i(݂Qy !ZxI[B+U`LPƛrη_b}dHE|pT-F/pk&  y.J*؊kOύ}hj-<4h~7}o>@jCW39% m;$ޝ9C_[/xKaߵF^<-j0xYиD lVr? V2`ΛQl̷ɊJ3rJV'N2{# 5dž1h7tkSj3A `J]2! A--VciW/*} Z"vb$ q]nHX%; 1pbv_<Ee 1wRfU`ɒvts]WH'+߹iu< ѓ~{;_ummUPCT~A9(`K!}wKU@E X^*iUp7[a#U#Oj7n)0e˜ҷ<>5k TKPNoN,]y[`ue;0=bSw׌ v5!.4ܧl8$|#mZ ]Z9 ~ ŏ8 6ākb YTUȷS" !ʹ߭n(MZ1(Ú#pJmW+@ J\[p&ϳ2yp^ $I4Uvܖ~ƅ7Cbj^IYi%yVT>,s[ \o]yڧVХmaMNL7Qβ[lRIs"?&/Pq_x m][g+~}6_$Կ k|6We~?%%8|n{Bj¶)BCWQ' 7QRd`v5;|ҋDiX&QiZ/Jks8={f4 ew ;zQ=:4H0Os_ KѿU,ty{+=0f*24"dM述 endstream endobj 1522 0 obj << /Length 2608 /Filter /FlateDecode >> stream xZKsFW`oZ{q*-e 4@ZRo @A$(+[ʉLw7@8sq@:P4PF`z| h)I·?N?L'MOM"Fex>!XNߜw&T;og<|v~~zz1m]L\H 1DGK\.uԐGT#ƽoYXVi]gy Gj~DFۡS HќkY˓:SK>u6kz<_Ǧ8+vKlEfp&GU l;{*((`Lj͡4qf!*tLӝ,D=3nyeZ]z7-FGMԕ9WJ3a|,y?QvZ7% 5@:d/=)}=O6$}=φbƑ`V8,Ovab=,(M.>+H I]X澳i.\]w# %^-ۺ`PfԾbmbK`%y{ùW]Nn|rrܱpI7"vst?I$9xWr0m8E+4I~2O2B5WϢjj8t1 ׶cM6Syifyl?R;&3< rQ]. W˽碀1XphCCBXbĨ5YrU& Bԛ/_UkMb9aV7ߋtOL FF_!nFȦ= `ʓ4?85tыh\!nٻqdle,3Ιw;3ڛ-KE}7f0e1ύcĺ7FKnEY$:l"lh mzp G x+@_ZX>K<;vUHo^27ΏE;uv|;ZYwja_vvm'(;- 7_VC+C{,F䠻]o{-Q9hg 6HǼxJ~/iM'hEj!cPboxߌcjn-, {v0 Oa5ȼЬQf$!CN6iq~wd(wRUozU{"ϊDM*oE*> stream xZ[s6~6a\^:ˤlNzIhH5{RL[Tl;L%߹}KE^NN_bRrkrkÀpY-ɷ Ei[ N̤(u廑#g 2r|o.]}sQ}}޾VQ}lm>a$ߎoV\X?x#OZNK~ wb:Wy x#fbܮS6rl2< ;G rqN)8%m,qXdj$VyIJ *ߨY1껜y?P霒qBE#5Y ;Jr\p5VQ.Aȕd0p2JRhs8[5U ^f%"F}dNp8eby^`2ls of#eϳ%ňvBvOTƫ6#Y}מ%~rSeΨo'c.O&E[zJ_#) ;?-8agvS}*+C,bQad+sNc2FET`NqɳY<3"qn橓y`fDq:h&\O))~$LGB0 (Qé:M4l9{]5|{<0Bߨ(*mE4A/ YdF,0oτ HY-7Nf^T<]+Jzj\_ [zlMUƢEEm*<6w$CO:yll0UN% $U|mg$)SF}oAIhI܎^Mbsnw(DL7vۧG| -yAp=B CVcjO0a5&}I{,ҰUX͸HKPsC/t] ~]ǽnȼ;'ܖ{Jv{ofdzmQtq#ůƥ̵P- f0I~`EWK(f9;ԋy>S4R9E)AQճkhq= AI/R 1Y1VtUe_R RLYvo  q UF{Dٸda7g>FعIiG*nST U4 fE$2/MnW*Z ?mJgMa洯`&-08 8~¶)32ilǡHF% M355FMk~hlkQSsw'pwZ\W岡'fXq}#^VyVɎS3F`gW/9fN>m!!5Sy'N;Few"$x7; ćnHT)zcv\}ӳ50G@X{9@o 6ۃ2.M?p*.f4'5Tx;[= ~CCڜv<xc_$/|0^%PR5BvB$HTP ÀHzzH_dzI'ozq f3\p) gU> k}(PFρ@FaPC!Dc;h_ǔ5Nϡl\s~mOƳCax!ImT:#Rb x?/ܢG˅dWl(em@x_hWu'_;X0g2qăL\G8\B^B^s"~嬾WSPA~,;sI$yi z=xH?қXᴲ??'!'ywn7Or_/?Hf2UnM'IȖ8^9PBFxм>C ;:597Yi4;oI&I(=HͶPbw)lk3(j}|zsku0};'O+v'a0ܡ9!T|#_#+|؃NA෷1:x2g?%5+hêa gn M? endstream endobj 1518 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/potential.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1535 0 R /BBox [0 0 468 459] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1536 0 R >>>> /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 1539 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 1541 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1703 >> stream xTkPWffzZ16YD  ^JT4pEW+ ! `pxD ᡈ J#L5+=M]FRֽKb3$Ʌm&/cWɓ#y{3~MN$ˉܜ@"d.:XB8GI7"3Tq+7eed); (6kr32N¦@i2fv*bR2s &-_ A,KhիVQz[AD,&\D0IKK!,aEX6- Va5b\@~N*":BqQx}UIde|w0>L6 /;vfgӯa)Ɲ `o`+xjOA p y[6@4ג 8;k 6!aK#E'5l1 #l~':~K癗PmGk`Cfl|GU*ˁQ83ĚXkqFEuq*b%g6/;2GU[7"POؕq(jl1@->N :`eJ_ta60"?5]8}tE'-Y\ ;*<m" G~w^Yܛ~yN¢cr2;& :\SXs9g,x~0ɟ#,)8Ԝ+MVb1A/`>:T5K'"5Qն_ܠKsc~]K9k04&wAY%VpV$ {Y3:ɼLz=jF0;a{d;4>6pg5<wwEׅ"_M =tL EO0𢋁-M{Za"n p`3[b4)p/jM,K7;}uT:ȡƾߌ4X2A|L%PGc5>LSͰg%d^} zFS JŚ죶4HHǖx, M{Cμ]+z P6tW_4\`t$%$mؐ68c./foTwѾ[Fn>J&4u[@z}ӵoTҟz;_];Wga,+bܜP$Jn>> stream xڽZ[sۺ~PJMpp#HƓ99I$iICKņw R NeXh>ɓ~Up>eq,'I"'I2d3l:K^Dt|Ǐ^IS?z i*OϧpgƅhcDgᯘ'NxHg:+5ɔ)HIIϿj9M*'{cs\f,MLh&dF4 i-#Dj%ulm0rV$,6HFrH֌f*b*45gLԠ/v*"[H囥ooԖڶxυE4͊Zۼ׶5Q64u*x74~^`T;'~yYqwhG6ݸ_CDZWN:308I ϧF|}5;lvF-b[~Q~v.PV.E;`p1hҖ_\!rrBbdzMcsR6 Cmސ -I5;T$5-:cB8]<7Ob!dha>D(#NxK 鱱)(1T3cv8ETd#jgQra2o(]f٧nڎs |iYXX;˂Eβ.r CbGv.{*= +?0d]tjRaiQm5Dt7|[C|I&a&1)o Kn͠W8lhA 4vGdimiȤ|KpvҎS( N?'hs(7tK-7/:L}# [ T] e/ES!v$AH6bG*A@y@xn%߅;rQM>Ie|) o= ?զ2ks# 1źdm%@Biz(1 05S ,F @&i.BA#&I򰸑{^"$fiST ^<b1a`&f$aY…1S,H) ݀aPiًJlwMpwAEpwMw`V4Aht9 Z7<muER<|+X*k 4kHƊm_ "$\ `T s5c '!)&㞢.W8;YH&X9βT4 wy,b3QE  X~bBA$wl㻗"= ц @]boPkp Q74p,xv {_BݣCpIS_h}|i\Keb~=}:sJӉě3p>{O0ۄpv뉆Z9ys79pW8PHy X .hgJ+(QTnE'_!O=uD 7:r4Q'+!w:/ȝBߴʧ+Wf+a Ov=UpBR}KřO)\q;Sjp|],F-}dI8]wPGWܴЦmh_W[e?Rw2\TK9φ(x#)MC77k ;+ƽ@N?p1(v`4<~jp`#7#69].GqL~!`ZV{ endstream endobj 1429 0 obj << /Type /ObjStm /N 100 /First 984 /Length 2548 /Filter /FlateDecode >> stream xZmo_1n꼿VJ ,[v ͽ>gIv׎ױ9ss<󢬎L2eddE*(SBA#bOF3%gJ.IޠmlOYK-@ "oQ7%WM%E]XϴWVRS)ds) `֚4q(@m8|uzI'4%t1%ˌ5.P uf&2D#Y %(M$bVi MZ= iidxiPf+le' ]D+-Ռh-,DmC'UQYN;fx뤇b1P []БTR"Y y(,dP#K0sKH%,UX+ܒ(y,*#57S 'z>\5ЊOP]DJ SI"ՅA$) ؙ%h )"Kp= W9TKXO4E0I_ z$OsmƓ'=q_Iۿ}~te1QA'b1ft^ſdzoaҲ'>:- aE Sr TuI>z@XyW* ;)`z:1 sr8Y^oe6J~5j7FyqdB6cH?懋AuO<^:oT'^hp89 y_+=fX@.gO|Z$Q8}Q_>61I!fbVGSiY~R,fA!JQg*.|h\P.t VK3=c_01)|2bc7? (b$gBƄ+]ܷ@G @4]^G\n)am!Kqt# ĭS`wZD7Z$6.lD~˷ܮ B6 <Zxqv/N /.5N/Ŝ8y^ +, ΋~9N˂<ƚB&msQR"/{3=M\\,9?JyQ?je}6{Geݭwo?odnbי +̻Τ7m7 x}SK֖L&!Ʈ A[ls F~%>(VXLF ӊfW${!po bne>pf.ᴧ.tHӖK\gd j0f*nQ' l魆`5{-h ͂84L <%Vu07[xSguB',_|0^ oNX-C9\Ӓae~9LyyML:}xGwЇ9Y,ec<9Vo]4`].@]}1kC1ϼys]]:8ُ j-9r&p]@vC6! &%A7K+٬wV_loӌؠwF}\4FHf."I'̦ۡ@59K-Bt[6-.m]xzաZɡN6yDr.m؜sJjK57l]*"s:LIlV-c4+sv_M0ݢFVjaAfgx_ὼpWxKU,UdZnҜ||/6g?[w! P5 rPy+7 OdQ̻)ݔf{ӎ&uܰڟٴ}xo̼/Ty5,}vݖe&'l!h }#V-x endstream endobj 1551 0 obj << /Length 3244 /Filter /FlateDecode >> stream xr]_1OT$HCqv6k9vJQ$=Ñ9J=x s(S̀dn :ٛ/^fь1+g3g:"]B @Q:3ϟ8w<< 9_ۯ}c~}u|!y#"uy<\W< p,ľbTIZUt3Y Xj,?QJ\RԇPsއ'4|%WMЅ! L>u栺PY-lI%jgu){١)(QmR h{SoDM'C;Nj4jҢ"7Z0d 9VF?T.q rfucNd>rYPo T2>Vh`0>5Z43vfRà.V^TוTunZěID(jLzjn}n}vj KP>r_b"((HEXFPgpvc=܇Y<<\cw=<+t8*Ծnf PP6nZO| D#ea] X7c8Q9T̓"Obѭ5-TX{GĠrag~Mqt̫rgh>O&>+/{^i|4<n8Y!q\]'DL9ZATdzubfB+! 2HU^7UbEN"!"ob}1:DGvx6;&_ (fP($&BtVݛ);~.BXխ9B@@VG(e!yvXϲ@,1CZ{D'/B %!r;ȩ !.q TA S2`A *#;Kʣ>y83j-@k_VqY Go6E9|rJ""EFګgf?b;9D~X؝ԬRY>&15#KntQf@-ch)97s~d?HTr}ˋ۞ap_w9cghO #672DY9u#T(XO!W"GqqC))`PW( |pjP2׿{rˆfpȋqcOҚhoq_}l89z4HuXd:?KL&lJ na[,:ɰ8=4I۸x,g߸Q#NOUIe;lܗYaM0f=םmm ɘ}g4FEMBeKLip\,dBD?gҍec&Yye_dLp@ 0kGE&̘x "9E ^+(Zr@[쓫"p,EھXN'Ǡؐ迴_zjv c%h.,dF:ͅ-$]A=Hm](TF&weA`RŎ-+>k|H(&(&M4ЄER[B*Y.0kj 'VZWN#YRSz)N%-x7Xi6slrXɮg4{v2㡂uQdVI,}M ܨg) {DEQq}AF&\({acejݴk)֕D.ZI;@7a|^W+#=f LĄh|&FHUqdAFXYa^YB޵zN1[H8S!2d3I`pVFUerь1,6yU^2݌1+:1+N(|+zS/" îŷ4 #ΰFm. BE#%Җ ,=k'o{GqwQGG1SiP^.?Y ]dHtfozLH`C<v1>6E׸/ehu'[Cz)6WxL%哊:w[xфv6m3X'c,k Ԙbi"wDL(H23n2!#+>o@':P 3b*|'hЎ>U˻-M=g0gsFu9sƖ)aߟ"]8ANbY7a) mRtX"]K&`O\HW| = ylM^Ɨ_%fq8Xc7> ) "#r"x].>ApX$;tcn,̰ݠ,6{dp EDri" {6MO }Zmm\  9m[>uFڬ TidXDՐ %S Vػ.O֎YKĉo&o̺cd)iّ8&~Cf2ur("Q4i׋{o L I Z'Aɶ>>pU~Wz,Ѷut UqR!=uU=i Aw'bua!DB}`$bL)KO^fOlsSZdV ![Cgg:X+e6h}7m>N6]6U!"k8&3JT{QWe?X;V% endstream endobj 1565 0 obj << /Length 2153 /Filter /FlateDecode >> stream xksFOYdzM%ܖ:?`-(,;$в.Ḅ_ӯ<񜋣LNrs8g gr ԹH 4CW =8{K`0Bdk o}z-۔9pF}:,s6>\}'b׻ WL*b$A E-BxػdQ r(E3>Pv\G3g-*2 5H3et ~'eAzVj,2^uZ>wkE[F "6f?|?Hdg6~=]s4$2jb#Z_s ӧT!"0*P : tZ`ޘFLkE/[Cp&b>I{AY<^)ßެqWaףO֟fā ݋WwDԚ䷟ɋobGF=gއ8qbcX$gEMrn~#H+r< |2Hx` 1nP.e,jtko^"d-zfN"F@UX^*R&MbQ'I x;tJl7 E:90i3o<]vh֓H3?Ew#+$)S>8B ׿yۢrUW5'e7W;h]dL|ϴ}=NTޯ4Gdktc>Jq=>>'zqg&I -p.6C(6Ӗ~B/R<{ҋ __##od1 LJG3~}F\K/axu`w8)4.XGFet`(u7UY#/%q$۸z[i#ϥE9Fxmby. V]! @Nʸ@72 4w3WY7$!{5>QA|頳d*@Mf}`ғe9h{:# w]b^dKǀ><𸑗3WLff|M5ۘ0]vxU{xPih5L }Q!MJAKWjh UU|z7v=\9"٭E9kn11 XӸZLgeWAO!xC*Y~w1$lϫŲo;J˰:[,'蕥;0m)AdKA*ZʊrK¡BBFGS hvL:r{%{]-V= .jj̒yzoF%Svv<}Հdvyc"8%ARfpvQu߉a.-ݾcs Lw.wwS`݆Uc4#$͋t:ͪޡ_=0MNF|)AwO[Ψxvj,Dx|`fOOaoiB2]$gDW"]UO^1- DN&j>U }ҁSl p+M/X$ɪ˺xk4 ^ĸ][nJ0m ȲIPs1NSMc3Thp\\))dqSh5T[yS~͜q@6KMbjvƻnxfʢR },3 Ƿ<ФxΊ|nk М $# '}ՈB=kc(f>)8&JSA^Q2EJ~&>k| V3{0 tO0 endstream endobj 1561 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/convectCG.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1570 0 R /BBox [0 0 468 459] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 1571 0 R >>/Font << /R8 1572 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 1574 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1703 >> stream xTkPWffzZ16YD  ^JT4pEW+ ! `pxD ᡈ J#L5+=M]FRֽKb3$Ʌm&/cWɓ#y{3~MN$ˉܜ@"d.:XB8GI7"3Tq+7eed); (6kr32N¦@i2fv*bR2s &-_ A,KhիVQz[AD,&\D0IKK!,aEX6- Va5b\@~N*":BqQx}UIde|w0>L6 /;vfgӯa)Ɲ `o`+xjOA p y[6@4ג 8;k 6!aK#E'5l1 #l~':~K癗PmGk`Cfl|GU*ˁQ83ĚXkqFEuq*b%g6/;2GU[7"POؕq(jl1@->N :`eJ_ta60"?5]8}tE'-Y\ ;*<m" G~w^Yܛ~yN¢cr2;& :\SXs9g,x~0ɟ#,)8Ԝ+MVb1A/`>:T5K'"5Qն_ܠKsc~]K9k04&wAY%VpV$ {Y3:ɼLz=jF0;a{d;4>6pg5<wwEׅ"_M =tL EO0𢋁-M{Za"n p`3[b4)p/jM,K7;}uT:ȡƾߌ4X2A|L%PGc5>LSͰg%d^} zFS JŚ죶4HHǖx, M{Cμ]+z P6tW_4\`t$%$mؐ68c./foTwѾ[Fn>J&4u[@z}ӵoTҟz;_];Wga,+bܜP$Jn>>/Font << /R8 1577 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 xTkPWffzZ16YD  ^JT4pEW+ ! `pxD ᡈ J#L5+=M]FRֽKb3$Ʌm&/cWɓ#y{3~MN$ˉܜ@"d.:XB8GI7"3Tq+7eed); (6kr32N¦@i2fv*bR2s &-_ A,KhիVQz[AD,&\D0IKK!,aEX6- Va5b\@~N*":BqQx}UIde|w0>L6 /;vfgӯa)Ɲ `o`+xjOA p y[6@4ג 8;k 6!aK#E'5l1 #l~':~K癗PmGk`Cfl|GU*ˁQ83ĚXkqFEuq*b%g6/;2GU[7"POؕq(jl1@->N :`eJ_ta60"?5]8}tE'-Y\ ;*<m" G~w^Yܛ~yN¢cr2;& :\SXs9g,x~0ɟ#,)8Ԝ+MVb1A/`>:T5K'"5Qն_ܠKsc~]K9k04&wAY%VpV$ {Y3:ɼLz=jF0;a{d;4>6pg5<wwEׅ"_M =tL EO0𢋁-M{Za"n p`3[b4)p/jM,K7;}uT:ȡƾߌ4X2A|L%PGc5>LSͰg%d^} zFS JŚ죶4HHǖx, M{Cμ]+z P6tW_4\`t$%$mؐ68c./foTwѾ[Fn>J&4u[@z}ӵoTҟz;_];Wga,+bܜP$Jn>> stream xZms6_'$HR͜ڹ44uӻK27HYP/&)YL- E(E9].8y~yrvc$w.'w'v;Q]v{.Tɸ /)R}7=n&=syћW?z%^:E{B5i'` N@rBvY8gg=;viܳ\hL~xuakO5 " rV&`PQ`q!t, 3 I$© h褐 !qurd?~b? Odr*-YTek8ȧ I<ƯRDh?CѴc Vb8a{ O]s Ws[}cٌvLӄdj¼ӣćG#Q&WO"Zrudq8cbGЦ|*3B k<F..Ta luWn.Y3^TZ<ڣw WIfIn@6 kZfeJ(je, 4=<9|S D@zjAOPW҃7xg=gBn/5 mk+<G%$?|\~=eY_֎[}(1=8:E*J((7SniҨ"^ůߒy{4(t4n+XRgQH- i.G*ov\e"!2PA lGl<<: endstream endobj 1588 0 obj << /Length 2649 /Filter /FlateDecode >> stream xZ[w~ׯK{䤍OJm*| hwvgDQ8}`v.:xqgc$<>8|B 烋 >M|ņ_&óg'/M[ vc'>?;7 ~U5/)B)%!:N. 7 +7I2Ozj0ɺ~ $d-g7dやۥ@=z}x16;2&#؊OUȉG$*4.piaYt(V9]f9`iDo7*q꼌KZaLYȀaK6̰~4Rh7a9[my8Zdi&-u:ʱ]^vhs1[' q,fNEcmF^fV3s rqZQ:8|' @)fYjTpR7 ACwceq#L2$<^,q9xN(@s|Y&W" 9VMj5C;JWtj<& ĹGLӽeTs]MLQB >'BQxd7xfZ:-3jeECM3@4b͈g@K=V(Jk6`.G"سdn:8bg-YaK?9^^^W~> j? o&y$ޥH Ebz{;"a(kEus;|G}<<߱ FsIY\޶цTv^b!E|0yVZo%$"ZN٦S>V>%S,uA* OKߗY@G/nnD9oM:]RC4oX,3{ӞV|+ :"L=?)Q썲.j(I͝VIt_5!*ne_Gi^}jDNIϤy]SP2U5 h¨bxVSfL'QQƳ4˿ݲo'*t|Ozh(Q^}4=˒!<ܞ^险>+0{VҍIlT,yhngTr']±8mr S4%#ۉ&uޝ"N$1Uc ~: :yPv?՘p7{\ Zleb 'w :A^[ο۫ %%Yl%WڔSzجrdd%'iZǦ'], ۞?%pX)ICeUPRK[~pJ>]#|jS(ahv+;خLCc{$F!&;, 8ŰXE6aQ{MUw^Ed kH?Ĩ7 Ma-v1F'>64`3v몌 va\e ǧiQA@ " 5<@Oh;LLICfQ%BaWDaFs Sum݅ uLsWE_;v棒Z+oA*q8xik=GP؎S9g%MwMŭ=%j4 I M<#,!9t}tٻV8bk{T?XcD}oBVAч..04^-J 8#kuG :PpT f)aDƒ@ dpvwkxQM!CS{ Qєsm] ,B@@@ ;[1k%|wA[^0_ 1Cu#=u֍aw?M.x-xm/,v endstream endobj 1595 0 obj << /Length 2946 /Filter /FlateDecode >> stream x]s6ݿBo.o!8u&xnhD:$@AIuncboL'dɏ'P34Ndfq59_L."n!}0YLa%qP?ه3x:ӊEo^fut׿{ўO. OKZ,"22G뭓:憵T}"LΨ8T3#| H-f MJ71/I njL7Zd?OgEu6E˴TF7ojc,گU8qb&3CbCdFE,:Xک­uE-fUd Pvn)or_Wq|@L 8$ъ,$$J5SârS\\f=gzwKDhuhWKnvv}y]@I@c;E IUPzIlɷ K@OElD ,I=O..d/Xh3뉠VǓlCF%P7e$X,D''I4h8f m e5h:&IWBĊg2JȤHShO4 0da:Pth!AmH8doJFOQIuC !so3pLhS_ta>H>x#!ef1D!䁁 uSyj%cAupB NX$A`p tڒ^hOo@k[~j! - x 5zBU  *! Yl;\+SICۀ燠{|@"*7; '!yֿLz6A@SY4x $ AO1~.V;ӧZ*LLxhvE x$}=!iӆ!6F@C&@yLQIL/TLhBoW`"3FAe-)8WRmeYg e?woyMզsg`.woMY܁zI7+d+nlo(oQ6nqZ}2ʾ&u:O7TǜְFy|q;d[dVF8 r% !_d߮[FOPK+>'$/MHV=qS|CSՃ[ H7$Gm;N@qHUL8-wj{Z_kw:ie0 @?P eCJb@@O}_pSa$2fA }!o @O ( &? )cN|6#i Wt^L9$uL=&Lvy(C TE }w r'INR80=6cdȎ_W`|[s"/5`% .iKО5p:&+rMVxuwUy|E+i8K&LPЖ;uNI{9ݫY2Dy%@)a޽2HA!bHο7hNs"{d#/̂A¯n28L6o[ؖ0"74>[ #v b8ROmj+StӶ@}#r۱?e/nԘ}$?ty<c>0v06H 'Np,j7nGd$b_.Soû~ۯܣ߮}Zϰu P6\k {>u'oVu(IeWnDeej1> s-2wf-~S6oCw?BشI~}gܬIBbt/r[X+f@) 12*dgς9-5Қ_&P%ao5˒(;vLh1v{ C `0/Ĭ1ʿbl E?DMvf)s5.kz/ rKh^@:]W!&xbꝴԇA;>56:_xB?haa0HTHCҫW^uʯ.ouSbǬxKؗGDP*ź.5/Kh=?.ΗY'HƉΨ7w{PwZoa?JO),ZoWe7u* †ng(cXܻi;]< pC?a>RD[^W4 R>+g~p29;?uR endstream endobj 1605 0 obj << /Length 2387 /Filter /FlateDecode >> stream xZs6_K HI9];C-sC JL[rdbb'1¿a#A㧣ӣ F };[GrGp/ps5"cWl4|z\.Ӆ훎?/b >}F_~0N&P¹BMt wB<\O)"Cq"](dШ5fZ&EMe߷(`dYY>mؤ`?h |鸌H!pο/$b(_ a9gg+֡doB`@ OҀB冦`:.jnH(N ^[ՠPҖ6-h1퇄J@ ,0h?l?I葜^{>Q8]뜬P;ڂ ?I6#c't\\O{<z҂&ɫ'{YTsD %yB Wˢ}k@zOB0NNr.v/3oo,ZQs"$v~ uQ9\!ZµJ\AǕ^@$u-MwK$YԪ^`VįUյš55tn۳wk[&9Ij=G/8})l;0IBf6$Y#>$xTpbc% OJՍo{sl]ArzWq9 F2<@k#mA+gDCdt5$C# 3LyNVgEʼn銽dV$g>8oZLQӱ3LQZɲ:;ywj[YKnxZYR[dTs[]=|ŕPрxD/#7|(޾zin5W:/奮-uK5ʵ]W毚ro?;<{,]"znj s܎4vf}f"Dەq,i0iKb Ե>e6 EokT#\f7LgQ]eR5Y]iwTZj^h_ BkH a`wبS˦δ'=t1< !T{Xawc1 MR,ZMlOKXieI?th8*(pN{5S+eF-\J(eR@zzSphˆ.F,H@X 9{w~ B$Ѣl)؀UX,,ـ(gae !5uZ-*ⲲGޞsGPybs3bRyuU' ſ\Aw "kҸEj ڍ|f2-@Op4=S㹫=?ݧy+/c;Q3a=Og-8ͣ:i煕n `jEO0aj-ʻ(OEUQV *&]r*a4ltH }wB". 8<3Aln*i-rxn)΋nf9+"~(]&4VĮha|yR&CASɼɶws}X`N_ :@v./DzPAz=| ygḱV]y\|YiI2tYjwMC8W{H im]y 1lu 2A+o)ʖ, Rwg!1-|"8}a(tx&˰~f7nc4jI>$ W4CyQz,[žF&CKb|/Ĉ[t H`J(ݨժӡs`OqZʤNqP'C'śΩ9\NjG'YH`/ )1ؠܱ_>|ƬTr jLI _B)KWn3X W;q!4zf |YǽNPO'`>. ]!@et3䞊0x?}}i{ "Oً@p(J'HJ:1|07 S:do> stream xYms6_oR hn2MDKl%Q.RGRn]\|@Ͼ=Ţc$C>8"\d6xtx= (q Njrrq5 C_I8zfSy:囋w(ZCz^LA,8 >>1Bt͢\q5>?vk>cHp J? c"$ zy]O+3|Nqެhz=8UOhi|slFӾ5ImIh2]~!cs[W1i8I,04xfd}<N!$fMc27>lBaS$aeWH"1xba0Ir8=D`3dxcqgDY}B+ؓweiP=ÎN&& 3"n|Qyv2ŢwkM#ZǍ><3!ٿzy:*&EcX~ (lGvLO?U$'6v|ͣ4ftd՘^KN $n>>t+ {\Tb1ḚYIued!,v*Vij󽣊E1)$^wrluG4c;5t`r56#+3IXbm,"%\%'aEh4uv'nG; #46r``9p ]^(_ө&ϗȪ McY4Fy=,-wUB68R+ t^- BwFXgv?˗4nvI!E tԬA4 "*LL7f'H"4 ӸOv~hꚯ0O {QVfJ˅e%T#хGͬ"\Ҧ6+9.㣃 %h/|aO^#Ed꤈ ~c`(t2Blw%M@EAvkxUa!(ssnKI'Lj7ZܔV%$"ng,\KwZvp>>> /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 xڭYs6_P !>L}=I{\m]3IPLRq҇,d&&bPm쟫/ix8 TƥZ{|NbX*IŒ3ro׫Wח_V.p b˫۟//"kvW@h,% (Dj*qLo<3"@PF$ nnHHil'e^޲Wu -;O4g4f(B/;K*l2 UvA*Suꓶe<Åv@uU7?Sy`vuȶ~sSi 6HѳC^EITsQVXRAQYF&]n]5\k_2kĩ1?l@ȯ&YŦF'U;#mdVVw P6o*4[2Nx"Ti:GJTjxkh;CbIx(+Bâ$ƃ%Fs< $f@MkD#"=I q[K$FDcs@YP|40zK$|<%s4Q<9J"nфNuSvIj)vBХHH}KOIB Du N{MS}S1 @0>ξ],);~jHLIYG#d!.D|n1, 9l"}WBO֥#TFޒR`zPz^MXUj̺c0ENh"ߩ8n]~` : Y3:0DFC:.9o yd0a5ɠ3[;_Ly2(F.t '~D_%PδgU<v=D*>j ^3H#X#~b~s8`D$6ۋϏGjf ԍhHB)#t~>1X<|jh!6jo?7Y,,h[C[Dd-&z6o5 D M'CzeehK m+$Knftku|nnQ sN?I#k= :+6kflYb<3aJ(!g4&2Г C C(p{,y:M>C՛0? 3• C=Jx6Ed*@H@P[vV֑g2s#1fbS#ycyqK|zP>|Ⱥ=Bs&d>e=mS[wbJHf4{8 AG/9zfF)cp"BxD(c`;9]\mŇީ3?"s8L󏻷95 j=#7R8I^ NPwܳfvGaNGTqe$|'W4/7M .!{ &_Z&Ȱ! ?uewy XEK(:)uG&e`{[XK(!^k^7scSEHʎV#b);u}v3ҬYou6K: mGA $y5Dik`wWSv!Jb0_[Y_q[IIPiYg`V51%k&[1褨DSlԟ{=}!2\IHy΍07,`[1ʾ$]a|X^MZgm'Lz/mѧ6W)/y?S7}@݃L&M癞0*!ɵ!w lt9L5/m]^5qaj+6GB̀(&M $/v/^E׹>QRW#Hol endstream endobj 1609 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/stokes.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1627 0 R /BBox [0 0 443 421] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1628 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 1631 0 obj << /Length 1804 /Filter /FlateDecode >> stream xZYoF~K"W{rI8,N" WM[$y, SE[(߻ORV' `of96ov^\Oz/ANq>G}&FAX H̄zԋ/\S\7ϯ^wo.˞@s(~R~W  '7t] \;ܳ2?dhF$dG`"G>\ &L`MCt,K}P" %tPJe)jQ|-TA/@zl0qIO~80K& hvlA<XYG,GK֊D@Qwڠ0G+|]g^vЂePA-^8!1Լϣ :⚊PiZd!.H0"'V{{ ('q3\Oh5J1 x,c%|dϐm;+FLfL֊t4avgmGٕ >f7,H Enru*ӦcXCm ts,(8Z 0wx}ظ2bkL!b0&ίMFuK=f;B ^ Z;Jʎ  4Ub0.d}Py8XF#$NJ'k6[`]qՏahm{MV" J=Hl-k8>^֧F{ʌv).) )ϭbVr8[MM#OA@SmyTmXք]](+>Q$/)W?Uy1ߤ[\sR7,NkU,|{8rO;JS(㼶{=@=l|[z.pH\_X V7'ɰt@!9M%0mKXeS!̂<, HҢci\ hGj-EM:<Wvi(WMƑ1CW\%LIB0nZeΝ3'I;T͟yb_#pKΩ*FIbw]1^z@gީhS]c3Gϼ\ &0s[?M#+A>VX#&՟ŪxZbkȂ* 6$:)>3H%d=u˜T3fEj`Փ Ӫ[5{Zw˞fg@?Ӳog"+}\msh&i=Uʶ"{.d+Dh}h.."o ҋ鬀umn0V!&$'Yja;/ĘDo }^8ϛF-nojNdO ! JW0 IvG,ʱk',h !ԉ}W6t6W:jگmf B@({P-#rS\`wg֪B*6NY]YdExGTȽc6OSl/+&i"CwjnUnsQb> stream xYmoF_˗Ps\&1p9Dnsڭk#Iʆ Yߵ\"HD.gwgf7tr;oO8yy(0Fdq3 BOɯSA%3lz1eqy1?]zz>+|Y|7G7w'̰?JTP@R!) lxy.$ {RQBx!+#(RE+Xÿ>w0ۧ}{ՠr&!ϸk&)2}?qe{f|{ &76jWP|cmjEh-}ٞ"oenݝ>qqNwً]#v |$Y=s8 = had=;a*.aƛA+ ~r3SU$f:wSr[,4psfqT4i7~nU+ ߷Q'"!@N-<ɭ 1:BJeQ]fVI ikPwP>/ؽ}6`&.¾>"K7r4$wҲ *zLHrJR`.ȴd@mp_fO޾Fq)U$a"h-vQ/Kca(+Ô`㤌 |I35 &6,]S驨NoP@O ^vpH ǕkViR*)>*-sr'WKwdys5aM:iCdS0 @~Ca>X[D J؇r;p]D/B8ʼ"l_~_$TTjOtQZ#MOh/+M,A cE-pG+d@FpfDADά?dlS5\OЦJh5L?UMr*0|ґ*3p9IIbQdoHv"'ƈ*\l\x0L{\[*,5Cir@O~h9ѐ`JsS*݆%S`jJ~eCV#C͂Z a(Q4;nƩ5nJoRфV_b4C94#C'*7 @ 0PKnk"}aSt`i$@} cSSI-_,,0TV+c,Ũ}:u]ߍo}hÎքoZk|VϬ5F+ojƷ{*Ź;ѡ!lKP վUljJ@P]_6,&Q(!I)KqY#~\*c|4 *Am-Vm<8L.??Ѱ@p==? v,'ɜz endstream endobj 1633 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/NSprojTh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1648 0 R /BBox [0 0 420 36] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1649 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}_֬/

    :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 1720 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1703 >> stream xTkPWffzZ16YD  ^JT4pEW+ ! `pxD ᡈ J#L5+=M]FRֽKb3$Ʌm&/cWɓ#y{3~MN$ˉܜ@"d.:XB8GI7"3Tq+7eed); (6kr32N¦@i2fv*bR2s &-_ A,KhիVQz[AD,&\D0IKK!,aEX6- Va5b\@~N*":BqQx}UIde|w0>L6 /;vfgӯa)Ɲ `o`+xjOA p y[6@4ג 8;k 6!aK#E'5l1 #l~':~K癗PmGk`Cfl|GU*ˁQ83ĚXkqFEuq*b%g6/;2GU[7"POؕq(jl1@->N :`eJ_ta60"?5]8}tE'-Y\ ;*<m" G~w^Yܛ~yN¢cr2;& :\SXs9g,x~0ɟ#,)8Ԝ+MVb1A/`>:T5K'"5Qն_ܠKsc~]K9k04&wAY%VpV$ {Y3:ɼLz=jF0;a{d;4>6pg5<wwEׅ"_M =tL EO0𢋁-M{Za"n p`3[b4)p/jM,K7;}uT:ȡƾߌ4X2A|L%PGc5>LSͰg%d^} zFS JŚ죶4HHǖx, M{Cμ]+z P6tW_4\`t$%$mؐ68c./foTwѾ[Fn>J&4u[@z}ӵoTҟz;_];Wga,+bܜP$Jn>>/Font << /R8 1723 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 1725 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 967 >> stream xRPu{1cD3eQzA4RɐӍ DCC=Fu䲧ege>٤{K)95 b=AmAǧ^oω-@}`]N܁XB, wc>ˉeww:;m♺hsIl$LOZ,4^K{CdVDMD F&BKJ̐BפYj$Cb&~~ԝ%9$ȂoA/OEE<:U+JFu3Q =|'3qvBIT~"4>>|c(tG~~uJ nX.[.W-s=u[;*챱=~築M/t9UdņCdbl,ƺȳ 4;t߹~}ouk=o5Ή XSR#/43sv*"KH|҆٣#O_!*MG>n_jS45^#aNr ~N4>\S‘FFS4O,8c @NOIiNd87KV/K > stream xYYF~У\3 EU$ byb¶ݐ:-_-bhu|M n}9z<%H\~  Te2\CG㉒$|60/oݫŏo|1p(m\H V`FhZD!J7ғJ|B5bxbctb_,1|OCtK<]o8ϓU : _8srV$&7:̗iZW`"Y\$&b5 Uۙx 1&aqB+@., xE.u]8f&/vlLD ylhAR#,*,ѣ!AXƷLG+(!ݡBlUap8mE>ܤ,XCW`],\jx#d l6/,ɋdmmԼMb9+ښu\yt;0Uۤ (܌ 7+LVxYrSF#&US'"yP0 IJVNj{q9<2j""B,JwVr z(p .FoatyMs_Nts8m \ a@10Bu%0[ߜ>d (h0ּcH5ں3Y6̣=bƽt9f\B~?,(pV/9K,fPV 4l(#_myd  |zC4RW fsnJ/Q:i!%$$y[^1B{Ew5Ð cJFL5j$ q:Ҽ~?bG03" 55WGcp[B!SgDMvj/h]I1HuP Y'g펐j4QGޟ4P(4uZ"'cSl͐Y;|lx Z?|niB0#d%vp aM@9ZE.+)&<}4!LXF{}V+0fO K\~a; A4fCS|HVIa&/~4yZn]3N{KcM ͘|#`{?ӗΣŬ5R'q=q#A1&WUroI-$BBiFSbXCX+ IΘ>)e7Ǐ6Xhf׼=!wUX:fjEiq:t?8缙#$@XVVԀC-9ǧ)Pk M -9`C&0Z4hmxMsO7噞`~z3nIA$:ް]ynZ`CG͡VD A%XCe {*f R'f$9Eu8w䱢ꛬ;z ";Ӄ#+W@y{+NlݢfbV:CrCFĊ?!Ğ|%q~0i3'`+QgY `>/Font << /R8 1738 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 1740 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1682 >> stream xTkPTGܹ*`zyΝZ@@@4<4ʫ@p C2:⫒4ТъB.1-HQAa$;qqJvϥ"ڿ}=NSHj(i v͞GJpJpÔ^EU?[JI:' a[HJQQNXNNnq^VFf' @Xۍr6?+#["n\6`s~{a2.-;_Tk3 uiy_W!Fiu>V|x! (E# -FEv9%h!Z,2(]BJJKޖ]uAS0$xQMF1J #di,WI Ʈ[pKzXax[ %l!R^$V!oG[zް"uHJڵa\PUIՑff5}X n;Rڝ9s١q^Sv|b5;#pb$W(jאn92n*" _3&W݉8l[C#TCfJϭяo +6#TH]܇Gd:-nGg*s?З&0Z.0-'/̢GwڜKaݘ֧89 W/O18sx_^An$Dj{z~MgO4T2odAP Qi8Y_wuȩ "%!$,Gps:|WeWAD(f ҲR8ȁ~ NpR"7l!+ U3zMnf3ikt'&v 98|wzLw}䅊o`f_OQwqO ?LV:70ljc{`d)~5ɝKxѧ;w7-sB˘3.ӻ^8@Dk?Q\MkG}/f $F1sɎMaZd_/Bj> stream xZ[oH~ϯdf˦RJ]ukuwV+lp 5\j߁`p\6ɦJ0 3߹w{={sj|r=7tM`Y덝ާ3U92Pe }Q}~|| cL]g._~ ].LŞ@Q?ғoR3a-} @VvF +C.^+X 0 ,Ђ@6 4W𐋨)7@t2bB'*Ct(9\3TaD}[[x 7~o D s' q` ݐٶrp@-u4ڏb%ӹp[@c9mmadzHցbӇGpyT~S0dD_"7NBrO13[f">>&v^C*V48I\2(R,Hn豳ל~d*&o0>qK1\;vt mq- '&2)ZI4vȗk=@W$K'Hՠ(UťxEFmqc~؜}9[9t [$ ¶.jO?Xӄ>Q!O޿S? .̏2W eZpI_m.|Lzv @ Z<VC9ª GsCGȭ%8~܁J(GH1$Ş0JHU~cD<4ΖCEV#[fDNVZƕ^u%YbW`Ӓ9JdDec' ´1iu4R;c"e'ˀ,9;w\'v'n뮬Pr7bd剚/SI~%@PNCNEߚN9qݡ:nbo=c{D눑/bK㵊תgk0g'`ԟ]! w"N'$g]t*%@:u#ĞǮX#).EAU'n7gUº>sȤ۹]8j޹<3射WP #rv >;M|) 9׸%~vO0]83oe$Ԥ8ewM)crCDDd|Pu*Pl.(UqJAb2WG64`bb|A2`iLiU_ZNG7fY!;L PٌN2 Q؝KPV4DW#r>{pI-jy4ƝZ/#pUЖ*@ō68B}(4r"hkڞF! +_Vl7Kꕴm&nfX6Qԓ5x9>- endstream endobj 1747 0 obj << /Length 3628 /Filter /FlateDecode >> stream x[s_d#"ofj;NN'DB"bв2wOI4p<,v~w gpٗ/X bffQ]g?ETXϿy?]Dl~ۿ-/iWt$ܒ^rW%"B@;RHtX!e `㇗VJ5Xs/[KB .@rs>MҜ&NI$ɗ/$I٪Py<&{]_}U2[ҙ}UR=U\ |) Lwxg_0f;+!MG*ВO#pĝ*v/m&HwswIO/X7kpn{_˭H9SqX[ˋ%,p(Р1t:֩hϬ!OɑAKp6ЌxgYa/A´hXYVPѥylHT3=eSV]Ha0-IL;A"W̩?n  7eK\ Vm%N NC%yiۍGp޽Яj_;tK~ֿaz>q˴Co:˳0Kn֕6i1qznPzmw0nЯCPA1՟fww]q єf]ڸen2MVЛ ՠzL_g59rr@wDLK;=u޿\D%D^պV@FpA;:rv$֜wЧ{ EӺ ,"M~ ޴lt7-P~1e%#1%8;?ҢT-?|~F]>ДKiȭ'RhM{h#(P//ܾ-"-j㻯/] 𙐵hTinʀQ|{?iJoo auPrx@-U6 _êBA}_NSr4#P@~S)8d(M ?ؘ@!l:сv9%[40"4g҉zvyu&d*V3؋jڞK8[K8vgI3\&>%dcI:f#C&d\2^DŽ˘O y z]>Bb"/ aܻv-k(&*~@ŧ1`x`KSH|4 HYqcJ|p7c1gt *oh`,C,bә&61G`EPq'~EJtd}-%=` WK=fy}XSA`c|  a'dԏs>q鐫EL5kǤ'XB`t0yA.ouG:PV #9Rjk(aE NY=@6 ץbxUZ^J5uo29aF] @{Ā~yϏ~ݡ~ӡMq'fMR4.  %B6$ oӡ]]V,{u؋Hyc0RU.OVYq K 3:}nJCVZK!>, ʏX,F}>7Ϡ D cΰ=GRĸ~qa尟&+q$YJ \nSѐ{Fdsy/$f r`YL#zgfmH3}*a:H[oU`E} w&П.5~jܵ-0\Ɵ2>RN4]{y@sWb3WV1~fuybuob};`[r+rvmBX!nDW118Hwoj"E:Ju_P{69S4t\ʾjnOm(K:hcIX9 wD r>`R*$>c{ܺ#;]χ$^MRVY]Qg^hP٬|ǂwg*Ӥj$ -fytKlW9tVtU 'M72c;?ygwnWtG0tg\UųtX I'Q&OvQg-lx~, Eg4}Qn?ߖ endstream endobj 1755 0 obj << /Length 2700 /Filter /FlateDecode >> stream xZ[s۸~[it;Mg4$~N6DGʔWd}x(kO@ @ M~:{yykfƈS'׉qpEq`i\pKf/..Og ә|?)//}=FUg!˽lmwM Gn.-wH: fJёI(:dt&z:y8'n^YxuFJ^2݆MZ̧@emëtů"o2Vv/J t HF6rD(DVZ𷷞哧A}&WaY˚zYYӒd.-6$ی¿MBi 5u2H!GNva`YI&=KNiw0vU.бlXH%NM~8NWha'6 +Hinj-xSA\[b)J=T9|^jr>_oy9qO&Ҿ ]ETe_ӛUeUaXWMP@D|ٙU+ DK{ebA~0Q+paC<=w~y"g•Kjˉ"ߜ}D潃7 s*p.@uwE,l$0z3&$H%|t Q"i*Qd0Kc|;X֍bA)z#b7Z(3NU$fdUݷ#zcxWa=`JxpK-@yLp.EMKZ(77 Ϙ6qi13F+Eb+M8[~.ˉuZWeg]~u)UO)C06e exD)gmŖh[:_EP@69W>W`^$ð!G8K4u<b~G>VƸֆH1\#\{b:u Xp`(1 "@c;o-kXju\eư}4 B!~Z!49zb?Zp}KeHcBJ,BKxRٙ @Qm>'G3~J(}cе۱9ܟ'}9 kiJi & j2#Ji[`iGMķ40E8TaX< \&k]54%?Y֐N\s|nn_v'¡jnT#%3$ĥ^QB׊ MM1 {{3N2z E)-_EƬX(mMolU%sW^RtVI]1oȁpF lp]pw =awūj-߯#Y C%2I''/A* > stream xXKs6WjxL'3IӸq&4z3Z-dLQqxiVЋ(.>@\%8 Aeh2(b fs%IӓW/ggsFe\Ux ^TU9}^+:4…Dp(aV2ϩF{OnE[@X1#^Tdi.M{WNw1")߼F2z  >;-]1#; 'oW6Ko]іMͥcB |a޽װ|ٕ11Q!$ 9& pőX*E3NVmW:&\*9=md,$,%\Uh8EPW2P攟A(Tanc\!WObhK7dVQ`Ii[FdL%s e@[C*lʥJ[˦^ |EyU+{x>ٰO3梌z8<رMgQew@ ݛEbW}zW%m#`#:1$"*+OҢ/]4w<-n|xfՎ:Ptw_ >*m6~W ,b%*P,]X88cpab_EͲ[m4uD-l ]WEw^u"Ftƣ' a(|(_M~fIM.\| r9cSnyjN/U,RԐ{3R*ȇOm̓ FAp"KO@o]lr^m'KGRVum{0Y!y3I > stream x3PHW0Ppr w3P04Գ455RIS07R0326SIQ0Ќ 20@VfdlgiQkldaknfu> c A]Cg# endstream endobj 1769 0 obj << /Length 2369 /Filter /FlateDecode >> stream x]۸}/kF)J6MtvgҶYr$v}Jl%֦L, >,}w?^Y$Y>]Βht4׳]ٶ/0q89L% B8xl'x:7 F- mV%J3[&lI[3LCcyiZڍ?@C@$#R9)`Я-Gvq ~skQgl7yV(Xs̎DRigoF 7߃mBo)NB arMQTҳ/AS̷q U3==n.iW3p쀑LYe;vĈ30@ U 6h HpatT*Fvh:/W%^I2,zdS'%~jDL$1af[chޏcF߀A^;\N҄- LllGL_,ԽCϪ'a4zw BR S6~dE~E1[fk:?dbRLadUQp }8{EpLz@7@.(b(DžfRiG+I|ТV~5)gK>QP55ENQ?tT t TuQƀ?+K2u?o \Ia%1\ꕗ߿0Q- $AGҷS"R^i fFCtSB}U`#^yEcizJSrϞ F؅sSh n+0w֗e/ dM.Y3~\>']v to}*5:d| C3j!]TWRo2;xHM^Hrp i/e,t,"!C.0>] wC?PRI*j@E;~dd棏XE`ȃQ1iOq4+&xWj*HÉFR B樦e1DKuW)%;=2B=)Ȳ"`yC9!ah\\1_oiJ1_q(yٲJ;`a' JoPl _ÿ0BAljAC`ȓx79\sd=p4tdMtb9KÛ-OM"> stream xYKs6WMO̴N&:@K͖ŋJSw:Ňo%n0n2zqAT@J&4Bd\1_M~)H|qhr4dLw<+~V1nJD"Jת"+ 1刎#?37<GB}T-alc7Yb`635Qai;#q |ScW>k(oiZؗaYeU^.{p1>B'X^WeqxeV Ʈ>keZ+[亯 _dB/.H "qsK&xv9 46EDca`L6c:iCUĕpO%w`2O47~5Y<^{õX]3 ,]>ϋg|YxeS8-?"g!a>iZ6۵^?Q3fv*K{(\@qz;2l6`j' Q,}F",tt8%LDM[C#rm>}$B5ָ' Q턜-LƔ$$:wX7<]H$E1kVw2J6tA*.y7 Ɉ]/f$~mx}]V*T4]Ż `7GD K[x=}iX 8$GW8A>!p{#:@DqEn=/gl1%y0^M%ǡTV}dq.vf#;W3OԿA89->$RlT "~eH/Fz+'pm"Q9G(d L V`jffVPۆ 4!&f=O=EC úR͊,rGi 6G񲝢gg!n .=6-t5rHQ35]sdW.8\V$iöh+.NL`]҃k;fDS#P[)*a= 5BzRt9p=KI$Tz0y&XG|sZv%iwЦ;2o:xC Me9Ňe|x>i)Dle[䰬z)%3(WAF|GW-L0^7^qj "A<|}? {je#,@<1`cWדW# endstream endobj 1780 0 obj << /Length 1967 /Filter /FlateDecode >> stream xYo6_ɘ͉DJ+bmȂ4KS M;je)GbI}Ky;YOW_R\&MDrGs~=&ԍW}@Pؗ>J 8kvn~qlެxQbUgnO?h6[,sNPH~{Ľb]od6eS`H0'YOI8Hx)1A+6mw*g@=F-l]pyĚOaR'/&roSiM D#q^$,%A #oN70 oyy_$×h^𚻄3% ~+" ]^ P^$(d\Iv&6sIcLRꉟ| Nvj2沼ȁFgF~|uId*7-L c@#aIcOm}_^@cx7M. ގ7J($A'+fNu&Qq'cnocF_8[v)V2O+h!.V/=Wujjjp%i! IؕJEiB$~BPAF_#ePi}s, σ'o2sƉ\c(tx,$gD~fO4鬐k,ܔJBKu"j_*YYG|ɋe_ Iu)MlL+cp|4}߁F jKPx9 4G#|赭.uyj}0:$۹b@n'1ql=eZK`QG;Jh$0R~(O6PφI !QrFuZZHP j_xQ-T3|(e6"3G\}l;%Y dwh,RS J#?ɇL\Mq? c D|] A ΏݐBVu{ #F 5D* q0Πc0vm .H x1ǣЀ=[`6shm_9 qp84C :lB> stream xXYoF~D!њ{Ji7(E݇x]R$͘r}ٹ9.v wُ볋K.(%z"B¸XNj?-Z T'< z+|G*s/eȜ#3^>jXHx2ke%K82{eI{\N}4erۄkBDnWo"r gċ)̩D=N\ uʴɏ4RZuNiXF,'% |Bh0=áAwdN|\ڀ6}Hq& 9a'3k(ȺsP*I8wYmb@aAՅ0UApgoe6Y vemS>L F!H_XREi pMA#[y0OK+\Nׅeԥ^|xvW 8%F.>gΩPyL%Bn8ģ6}Hyl0ORϓyytds=;r֝)y)N.C=]wF"nhe/u6M$iU kXo ͋H x3kg^Ԗ2;*u;Y(7PHޯ> ;OGQ69ƚCU{'^[8EH}TW{ӇoEլ0WA p^r[㬉loUY隆/!يΨ1v :2o1_ĤYplG8Zfo<#ԶILK%1.{9.3/w A `I.Pz x(T%}!CY Ox8qIsS\~FnCpMj̢zkZuD՘'@0Ӕ^n aw为1)sCFNR|0l~-5iʤV'fUctGHBohÞ;o9ê+0VXNY L~T5e;ޔ%NHi^ĻW/[Z~/\l endstream endobj 1790 0 obj << /Length 2404 /Filter /FlateDecode >> stream xko8{ |) tͷ}N\IN7|iV6ŒhrޜrO>NW\xO0"!nDE!LNo' 8h:S?Og$o| aaB! ;C1! Q"=hoqsVI.JL/oaX'ܮ}5jJàJ>&EQqĹI<3;h$!M3r3nh( Fu0h,.7$AɽlMW ֒2|e?olS“8yUċIJ /ZNev:c!fzV,]8z\eRcdQIΨ z&ٗ)`>X]\>ҥ!C7һjjO-/iyWiܫU1S}Q2NW@IҾYаnLs`ie "(+o'e] [7}-E+ > pÿ]j8s!#igII3V:/̜>y+L51i^j͛"jno e/t ,zHPuH#p;5t$4Hx>S͟fA8S_!F* S}1 W`ɭrb1F>QW^z7mHpѺVjcW_h:buRp_=0`f!z\1Q"Xl8`GJ)LZn8b,;$EAhu:F uOR((^",y*Da(.vtѫ75?E Ǝ.$'NY\2"HŻ3/|(o :k݉}!>3h XPxk@yFySRVҜ0q7փ:deFs1;[kj=5R>+;Qu`*tZ|znP)@@m ӈtKhGwTd(1^3G*Gta%8wrL!pm߬%]Up~â=G<5 d ?uQ O[6 viۗyoX˒ NEu6?e/8^!nJ~}$aRe7:oGubR= GIdb&oOFhs8arVwssǤo ǗwG%e8f& LbB^`"X"!xW};vHv3$DRpB3;>&:tj_f.V0Ԝ(r 2: ԙ\oy/TɻO&0s=~k )ó3 9~n#7K;|f^G QT`C έu/nKgK"^Ea47plQn~r.gn-%`-g%_KwS&xpD_ⱖ$%'Ogpf~v$EGqvD CZ;yzܺInF1 _8?~$<c̢d=2[1"-V}nj8sR3R_0:99'Ό.>j3SJ%\%vdC)C㹡KxE{{ \m{5*=#)zLWv$ONe wUEWmcZYq$HD'x)v:*t-oDVl{ V[aq8ԵA ldTKxᤫ epCE ֒&[`D//E"E+tNǧVשFΚBf=P2P~-*_a_]aGh /g`J"` q~TT7';kvY{!1{I vP\_ endstream endobj 1796 0 obj << /Length 3292 /Filter /FlateDecode >> stream x[m~BPTWYkɍI)µH8$$e\ϹH/'ro_ffgye0}qq+O(%JJ6Dl0N.֓f8o+nGDR^_/^/8 g/^1}O,W\s-XL~]ɮw,%FR|o69}kӚP-D `@C|ly̯/% FK[NR"5H)cj'[PHYUfaSeMvTY*KwU&[GvX@ utduZWEnZg>ꃇ̊RɱeQzH =C:ȪH.L>o#.M+ Y`4OsU]VBw, 9Vy; 1Nxkyp杒 3djTI 0.~Yz'X07Fb%|U-_-WY7Ii{C%ø^HVBQ)ioITPgK ('A0*gH$Z |SGF?ual,kYmj̯޾vQ!~{a {w.%̕(IluZDF!Ax/E!d+2kCaf_E@+Y<;l>;D *zcޒ'D&&ɹ|RF@j-T+k{^\=C9t$rp |r=`Z^v*qfwl悕U_l^7R+~ !OTlm^}Jb X탿*yhO(6oII ѺRνfX3UN g/XѐDķlLhHm-dfٕ,]l3i04yTJHaMcvTQvEla3}&FeU Qo`#"a zN/7kWl|Vt0 cNz8tOwٞ?esKzm/D""1k;-m:jo:M0VJ%:4fǖ|HN =ݥ8ݥ:&u#0`Xfhe8 I \;ae:%jx1Y x͢*F޺qHzT넸MIJQ?b0jcdgVh};2Dt\ ѣS Mh9{3KNw>2>ȏEN(<31z]d! ZDepN*P|!64q|.l `y]fQbuF~=a۵L5Әb:}PU_W|gM P"2Pܚ"l4rbY.MVz R!ҭ͚-Uq!A_wsN.g7Ee>'L%~>ޝ}'0d-lCxDp 8LiY5m9 e_iUϽ!x7mYDDKf.J]٠#w@UD .u0 . !XFV&[X+ +1dVIJHbދ Q+Su܉ QOlHnb Wiі \Zb5rq]b׹WP6R k Sqi;mI .r"hTC\`҅!ЍՆ u9^=AOIfr8")pI@BhSC~WE8|~ 6Ga#g9O)KqN2haB;ȖX c>@y{rKq(;S g7 e2*>MuJ"Qfӡ(h \c{&e0[''KGE٨uqHaևp=E~]$-̋tǞUDuH!g;KaIN t3V܀񡴩6Rl\TktrЋF{ݠKm',=09>w@XH̰FM:ӟ2\yٳes7{|pGuTyJMfآwQ-*SoZFb`޸;܋1WEsx2i(zg3٣pu}Lmz.벎+9Z*lZ#5¹o)D{ٮ:WS~r[\lԠP4P0E?l;6[AI,s[)y:rOHvOvw׭`h4Gt> 9{mQ,zGQHnnW"ӱGQ["[{E .`u,ka}|rٸϧdN 7:<}dw K3\C֛̐Gk"ĩꯐ%37=0}20taZC}PhHbVWe9TMi8'= Ry傇^dGlwO;{pD \pӌ)xM|Z6`7nӆ5٭Y:(e~_\c~ endstream endobj 1676 0 obj << /Type /ObjStm /N 100 /First 983 /Length 2352 /Filter /FlateDecode >> stream xZnH}W$ c'Ac$F6#XڕEDe0i A0e#L `Ts1)<Ӌȼ Tؓ.j#I.RIeH*GTBQ4$Q!ZTՌD+M#()!,SRi*)RB *9cONޱa1/hZȅ{gy~'?#k ?A}q%*0b|>*hp2ٳM_ݔK~={At"SSrbbv "B)dZq\4lno ] nfxt-m8our d%GJn{Lɴދ*O'{P8z luV-3R ʹh#:ȁy }zg C)UT l^g^|.!AQ)WlOljsηRb x5:|t} x ̿~\ [ {dܿu$vQ|@Έ*8@:] 4աy/{Sǣ .!02Fxh>ܓeF,q^Na;b~g2>gltOq6M N٨<&+pĬYd4Vp)y[Ou]MqQ2p ]LyGlVu)QQڍ؍S5gcbWfO^6J:֨To/?oji叭g-y, .ѱVc/{c;vjuGHGv[e Am@:CV 5R1 }4O$Z`C&$TFәcnNjmK2L](;%ORIR/~.a |̄/z9ar&LOz;+ҞY[啳еFpv!p%"rm:y]_G7JG :aA(ۣM"-4rI1ۅ >PL< 60P~oaުu, iϸ=zE=7­W|G[5j^R؈xwl 0AuöOh4N_x@d+[w8(LGl|_:5 \v>78熯:m▱vUzNu :y)4ϖ뮵"\DN_)=4 - endstream endobj 1803 0 obj << /Length 1503 /Filter /FlateDecode >> stream xZs6~_vm@BLKgIЙ^8;\wI;+!6s;MႀO+|ZXк:Ah!py7H!QC)Ѷ>eInfCe`y'L+9w "`Z <׵R4)2;RIð/r8' 㦎*6v(Q *ԭW02ԖBaBzVԀ4/ƀ^H9|J|ڂ.{1 ֢Q,wnJJ"Zq[тh\ba 2r~ɩ\ut*fƯa?0^,NH?xZADl +et]]; 1{W"f_unpԖХ^cH(OަSc$i#=ꧢ3+] 53u]Nꋓ+?8%$$GQ$n ҦKߛB,`u 1^KQ׋+W endstream endobj 1807 0 obj << /Length 3291 /Filter /FlateDecode >> stream x\KsWeyck7C*Ul@K $r忧{f$(2%+ zFgW1F",02 =[;/Ћn7!BX^}z.$w׆_~ү>5c!LIj^5$ä4|mD-4ߕ0AwiȒuSEv?*&kn*܀_ Ÿ" qˑ}U2qà%Zt"I>'Ksl4+Blj1c 8sH FGOh7C7`I>~VU]Mb0 N ӤOOwٝ>;'x`8=&Y^D8\5́N&~%JIZT;n] )6}]S&*Pǫ4vby aQ3 *)iOLz,mEXnѢg7c2Ju8$2 h*]3سz.t"זqG:ݠejIg1 T'*5v6ᐑl p95Ӛ0zh)S:J ZX[ PG'mzH72k9BBr9R;!M&(B<*Gt꘩HS"AkJYb'+ @%q+S~ ?wpF-o:% tL1&?]+$>qݜmw`oCts;T=Wup;*`l8^ 7,؃[P].-'ȫ,QU$.VwTIMm oUk1@meA/vH, hOmɆba pՃPtF.,=mF6Ϟ\8Y>8h?^g}h#kᥣN(\(!~]#gJh]ۡ'HA ]s?fYhUȼ5 ` SRE_1?$0kG:[C.كl>}wwWx1`O&˃d"M8`yͰfKtjaz= ōK[xR$nzƭ1sTܤ0$T7Qqk"nbD qky[$ /G|P S;%D 6*w[{4,(m<|5dLNPkNTIbOR<[uhF]3?;Ï4F{;*A뤬.+ 頲۸ҜJ?砩lMZd|*.\Eiuib[% Ϙ./`__Gxҷ8=vԵB3ا&#{徤6#VF ! ǀَMu\ wmo%0˴ydcs/:[f\`""Nw.oS|PoE^)T=]ºrC@G;ya- -q/J*AcZFZK.UGB܈[Հ-vS(j෡$ [ռOݮ3uO/6d5ȑZe+mp9tgʴS?Pr;o?o|68h6.Rk5yvJܝ5,R.k &&%A{?~ [n_lX?I[Lb8ވtZ{{7-Oh>ͫH6JWc#.[Nժe舕}x 0P $amawLf`J3s8y x4n?B uM,5MEOV:*e"o ԯcGNGNPo?JB  C(*O=X.tϬI=>|$ 3~[nKv܆xF rc/'Nx܌Z M+{d?X~V%U -ިobԴAS"07 "/ ܺFn3n0mp7!Ht<}[E$ ~>ֆ{JǬ(@U , f[~ev=X4k8u}{ ge^˖#Cbje3svV}nܗ=g"o7qJyg!lSr\y ^>sWUiOɍvY]Dƒ~[U(겟m>*)Zt[2bn"["TzY1UsK"j Hy F$fE`꿉O endstream endobj 1814 0 obj << /Length 2719 /Filter /FlateDecode >> stream xZIs8W$C;rL]=՝ԤsIr`$Zb4\ II\Dz ,'x٫K A'WE'*Ո29ZLO9Rh(I2}^Q5}{irk3~og K \H R3y$J$T#=W3M_EtV[w[ռf2|'g,*wScIA%EZzS! iG44[%T)v|2ݙ& ijԦ`̑U% V'$)-&PRHϱbՀ@MAP2RD˖"f'q:f.c%TR21Tt@|}~Y$,H(? @Rܰv{8^N/ֱ1 TceN|@r{d; K OY,09\I4*0~T0 (mN3\&ND2msrP(%B`i7IoԶaB*`9 XB8mh/D7c>Lbx_^Uf2ڹ8qP0c|(ӓX|H H401DEJIƸaKEPX En*^DQb:xѥL&jd$t$yP"C"2kJɎ)<‰VxB9EjpX8:K>9׌W|ږR:M09PJ!%?FPbO`h"B o+"bBQ6%&`Z(>Yr_wŦ'M)Fm- Z8nz>ӬUd#GTd+ϮyUMuErw&4yuֵzp--]U/.nnn:ۭP3/Ъ7ͪXg tG}^صLk` TYЁC3_~uwh[QaNG $G}Y:T.]V&Bg1s2Wsf]g'35qdƕyu6cW9oL[OTl`RY?/PLE[#4>)DКg^a D -jA%Iո'7bnd_oY6nXEVcÊirm .b.Op EcP)8H͓{nUS, h忰xnQY#A:&% y*aȓC-LgSݍ*Hb&4MŋxNyH䣛ΰٷ~7r1QQXX$:wYvjc+yh""SjA@s`?)v+`d᭨<>B0Ԥ4/YY|m%]TL]f\e2eoaxowpSyJa엹'O> R(3N}yA'p(A&ϫS:[pT*{zTV9\y ]u2_5F;t<r!r*(EzKPuMGķgN]ɽ'&@Yݽw/ڕQ 6}'R2|U4y9(+6׭0l&o_EV.X)0*`o.L"Pfzyw-FuЗ1q#s. 6e^/lsCs[s1`{9My{/t1A헴 u;:I|csDLEÝwTهg(&r6rڙb;R!5UT4갗|O>ę (6Oxwwu2xGasFVoguys)m "wɑ1_b[Bw]E bzO d%k iaw,K2ݑ)TѸ_b?{I),߳qa؜+ {roڨx7;J.V3~aC=upQW=1ijaYPh1VϿw~+|d!ػ7ehd]\0>0t=5dlWEQf b8F Dod]^rHO'K!QI&`hHILr/}stwtnxV~}9hKfϗTuc7K^ @V>ٮ.~ʁV ݼ! x:U~ W^_U2{R t Ԥ `U^{CX ؊:F;P3ǜg\")ob^ƶM0ªwpz?gğZsiل@PNdB6B\ɍ%]$gr_md :ԟ%DU i̖El[s d IXPrl)Cki !./#`l`z E sP4S0%~IS"0cEK4]y"ˏ)FC:};275ڔ)  Pyh@ޝ4IX 9&mi)u B?V4Z?Q4$Jav0DOwT8u㢎術F; ?4>qWU%c endstream endobj 1820 0 obj << /Length 3112 /Filter /FlateDecode >> stream xnH_Gjmu/d ٙy&.<2eqߪn^j[Tf0 U]uw̟Woy<%A fWY$fQ3!OW?,O2bOÏz|!E)6_Dy, |髷q0Z0FjlUiA€@c=U֎u`Nh;ܸ|{ k |%P6`dlyv#$AةAj_Ӣx]7 I.dYYY.]fA+6.`\0%;e1_EvG?]pÏ!܇C&ðObpnKVY6ۜ;, 43r&G NB}퍓%a+=T"@PfeZ <7iI1H:uVj2DdU)#ci lK_:3Fq.Ծ"B\'$C),pYؾ Ը>\mgi˛uo̙> dyS!OƘ ˆt+2c7*4m~O𕉔}sw6|"6Ik~䧞Qt"%|9 u3']I?w eic}t-%'}0.&5 d}mtF(=N0YEJ3J(0u0{ZcP 6PQ?JzmjCƭ`pNZ ~ 3]zpS /D|Ч ٩9e=]֗=e_߇.? %Dn~D+VtrZNYp8|bU6:)a1$_ y+-^<՛#m]ܛX҅}nHqg.tpg7Z>Ќh#oYF3 1∰ 9@X0^P/OEw *bhO5j<; B$!է& !pr|;pt=6-18Yo ՟ [ ˄Y&\58I& fD +T,?)zް&g5bBfg8QP`0$IfهOLB0yn@;}](fa l}*ZPaP=-;/ ea&~|O)WoRUL )FM= +q\.w(;@(DK8,Nd/J͆ђ!xK)r1DVjjБU؋FPy,mf]:ILbCKN)p*LZLVwWh֧YLDPmYnr_"b ?˕wSЦ>C񬓶!m#nO-`\ȗM G(MS~O|E0iQui nO$ul}תKӝHdT^s2LG$`arCȍodf;/TqwVEC_hyLsxEr"x_p}pຐ~G%vך&k%{!sob_e1:7.d+r}! ѥ]v~A\4 j& (BgG0>yX 0osJ$~_c })%~C!"^RV WM EX|.ŗ|{K݇:;2Uq&FɬʶKCEHiX2zPS:1[)d4GO=2P kMYE$<+/qKGfںh@e;Xk1eNtsvMv X`%;m<`hS I hXC1W:ۍuD'48wb-\<,JnAIG } 7DLXo8UHNj?Rc00͘6mԵqWϐ(ӊ̦fiSjNlS ӭJڸ~t<ʼnGqЭ9[j[Q[Q0/41}AfY7d`)iuI׿8" x*wcYl5VBlm+61hk6?{0| S OAÃh!+"SDDڗ0ZN9Hg7кؾ}9!367Wg endstream endobj 1831 0 obj << /Length 2320 /Filter /FlateDecode >> stream xYoB'3|SL68l>(lgK^Y%;|iŖb E Ù<8"rwvyK0AZE#D #&S%Ii2%3H_&w? 0!ޮaaD{մZ6boS^&)c >Fjf 0RV-:&zgO~=5( 38@#-4"VMOj Y'ɏGҴ*lViuG̳ի sWcJ^.iy~_=,1czUS""Ҧ#^,K M=UN2.^{B($=֒R>O'^gE[Pe?J*=-iEZI8mKFXE_.&Sq:$5HhQ[K4W|b6^ߔqbV Pp}>qqeF6QEl"pw?ݤa HqV~H+7[a),xhE0?*zo1f냁Ze3i+H./L"ޢaEFɃ]ԢP1 ؃h쨡a+ex Y*3`Z{G gf-RR I" ==rIW$SyWk54qm4F˔Ph=dj`xy`a5o}&Xb@}xBןpd5udq}1}=oFM_{oF؇J#DžX]< C4ASע47㚧zHjy0"QL((2࿒􇻳^pm t>|1(ݒ;2V/g?@5+ ψ촼@-=-G ד@b ^Wn"`[HU%/J0XX'=$+zj(/ô?,Bk[fb=CfMr^m-vk'\V.ѽªjf:"-dF0n Kkܬr2SB5[RnR!BLNl=pHbڡC.\8Q&xHqJ iJCU9lA3E~v͂~YW$SxF6 @r9鯰]{1Fok/A$JɸOȻ9"R95`^㪝t?Nm٣1Ѳ?q63w( A^z#cLBRG߷_ԋ]1[af3Ǫki*cukX]=p0^Ԗ VN\&vR *#q@}pIBnTw!iD`4"Tݱ`/"(|ݾl`cZk= p-W\b^L7-mI)|b7!L7M揓pT&r{a,l>\&uR "gAS*8DW]ذ /#KmNWq7? Q3mxJ}]p(0E dNEqߙJѐJ TYiX$;L< Y)lW ,'h&n*ݺg`鈸 @7/4[5Ԑk3hťp&|GBhTimb`Kk-nLV+^ƀ-s ]{\gvt]m $d,/2ߌeʹ,q#߻J<ЪK4?} .⤦hUy6&=(fj>$ѦMOz( {tlFG%`K&=syFQp9'6)&X%,yAm:mM~9 Du }IcTӘI5ɞVc1f:UzJTP jiEs}*~ci^X;%G .)me[9- 0B~qخ CnH{~ep_?H*6u:TxtC U.]7?ppCPF)U5O endstream endobj 1826 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 245.999 182] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1835 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kbP endstream endobj 1825 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/cfunc1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1836 0 R /BBox [0 0 246 182] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1837 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 1828 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 245.999 182] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1838 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kbP  endstream endobj 1827 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/cfunc2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1839 0 R /BBox [0 0 246 182] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1840 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 xYKs6Wht&$j7vtztRq|$:a*K.EN{$hH4߾4ѫ?09bdqGQGi& hLR:TvɄHI2ࢩ/󗯧$"0MO%M(_6ԋZ~0x,b6C. ٞ&ٟ&"XU]ߌx2NdlbZNlƆ}ukq$?MMoQ i XhvKmWGj> umHH];,Y:4KkiW =723%6/6*,Yז,$5//!ݶ2J s2+Y~uS:x$ Zڝ܄lpLU$dFmF Dʝôr_mCLNža S0"b+HkC 6 '#J8a,dcqJk)f-书B|Av۪6ljEDZ[N53#jWn7'7Bݒn{wu>QM%Cbm=#}lӥCg+1C$vE~%SmaHBpLÈ7!?-a<'cbYrư,F,RZ6zQBbuNY)1*_F"z50m\Lރͯ"!hd=TBNVe3þ6LUH1aB&f]/Yk}uOع?ZSA4IEUAfsGHa0"_z<aHHA/0wB02bA*BO{7Z6zFڀA>#⠳<(.4.NF͢7 ֜T^!Jdp@x * g]!do0/9źCQvitΧLQjҧ:_Dz~g~']*-E/5TBV5b΂4AOFިg^g2pe>[zAO`rLDKJ-!@?iMuQj_o}%'4@)b"GtfUba6}J‹ng\fTzpTI$%4.$I;2g%]"2caD$6ˆ }p-E3z(hb DU 2#8Iun% ` }SQĊ,}"SP0q"sPZIF҄6XD`9y L2Ŏ1eqs-@Oo=8/6%-̼V@GtboU4\j֐99+'rGHU-9 Ơ-@]3sy-7yټ* SN06+1nX>ao J*áa6Z$,3|Ի9xသI܀~a0(0 ,w0p%%2s%}N_[$1z-RƠa @YQ c'EJ<c@v 1Zק$p@]ٌbT`D)?_窊R<_/͢cP endstream endobj 1847 0 obj << /Length 750 /Filter /FlateDecode >> stream xWn0+$Th@/E('6ThPKJ) 0Y<gO#01V7@ rILsq>q\$qKze^0:|-1!p~^[q9&*^l4%M 1DiO$&)Ҥ8GI c|HF"cD&3a4ڇE n@*L\{v?71z߼i3p'90i0\ *%wSF;jwV61|6Ix-3| =;d䉽=Q+{4cƞe˺.uXgޞ@,9OKwqwy{cT+@Lm~a @ pe.$ [G O4{/%" ˤ:X ?#E=oE d$sޥp r;@⫈>%XAdW^,d+e4.xt{B?tV:X3a}xbSX`}.^E|% Z,>CE1T;Eg1C*0 B l].dnTL9~ӌ>U e֧MvF]JdT몶 SQ?w{DReݚ(~ d~iT{jQB endstream endobj 1851 0 obj << /Length 1089 /Filter /FlateDecode >> stream xZKo8W{YkHfC=E.E!?1ة#-R$2mʱk;>Xѐ}3!Eɟ%P)#N".$4CcB)F))Jzw1$1/ g*Nmˋݫ($JٞLZ4,R8"KF  %lHHᾌ"yX亳E&c 2z?(E>x8֧r]QpaEPi3Rj@xzƖYW[=EzB _,쎉OG FcQ16uEqO/ǽ")Y!gPr5nwF0 A&n<#Œa'N>Nmy~Zs()5Q?N6PiN ظiŪR*aI”fˁn$l͎囖b,SoS~:{P"D3.MƝ= &#} Em¼f6y-&v@H%wvƾ)|mKj%2b1h1MIzdBvQ1s|?Z; endstream endobj 1855 0 obj << /Length 544 /Filter /FlateDecode >> stream xڵ͎0 9Nō H,ǥ8L6Ih)Sq+S{P^kWf%ށT؏+[׏s[߿U?ۯ!Ia!ڪ"~"e49cws`!HEY,dGU&Իssql;ܥO>.YewNo*<~n/f endstream endobj 1860 0 obj << /Length 1707 /Filter /FlateDecode >> stream xڵXYoF~ ڇR ދWmpImhJ&*QHqSn}7s̬q pO7$AE` 2dE(Ku03>(02(g?LbFӐI4lwCpHi*9Ōp4Gc' 1t!L2&$cC(CS1#S=OS7Q FOKڈ^7ϱwjUPj#h $@5&*k*4MW+=ÈlD'yq,b/!5<(ԆoFTHP& +9I[9Mg6;g\!?~ j(ݽXT07@vmg$ GFoJd_? \˳^jXWp[8LVV;Q;Mhֽ4#5 lvSKyvuY\RN!A2HE%NF~XjȮ|u֠aȹ *F+,3Q#ݧ VUa SZtHcxCsch1g7 W!; F4vFq )x$B~30Dsg/olULA4N3MOeo - q@{h¹1a9cx(t,>֊P[ry=Da8 K\X9BC1'ڗug&;{אu[Z7~xͱ &" 0bEtemv)]#MtPiPFdZ?ͭXj^zPw7zU`*]@tf0.NfoM!X9`̮rAHu^' UJBdB v5h(r_ȟVgm#NډKJ, x=jMrV"Z&Ph#QY5a4 4~pQTDT)!j%;%9Đ$Ы*Չ&lY؈Uu  [ڭnu8kdUɩ 5䠭:QdRP9]VtN#(&RHiV|PM$$>2#p%} 'r J}AX`i ^8}5cՋi9ى_Z~'j&)seH^F)>O9_ҷA-/q)o.`y*rYe#JUݿSR  Sk<;Ra-%a30)8X^FxZ5ko&Yn]/yΩ;j_oL#;kSv_&)bf3Soh~[>3-z_2> stream xXKs6WprԒ0v$OӉ=ddYNԑ%%ϴ>x"DR%vžH}h`6\}J# )0rI1rQ0ގN_uv.RBxÝ }h@«)p9'TQ"0dar17ͫd$2v=4# 7Kt>ЖШͭnSXi(AWNn> stream xvFv_U[x;>qϜ̡Yb>WUxf \nJtp7sݏ #R|0D|ņp`Dz8,JhBDDXW?_{0\ H| .GocGL!uM*lhࢥ(IL04I"{Bͺ6kȠL*[1&#3gtoO$FT5*mP(g9d ]jejg4),\~)teM8&H %PCbYR r j bc" &EDsjib*z3B~iqQ>$Ex~pni6ta"v6 -dW~-k9jd~7[ѺA#G2H Z\B~ oXJIJrvSR-Ye i¸&XZ $KiP|v 9VΥΧ=Jr8rg^x}َkB zaur\)d4I"| 6tBhCn mX2Wt*N<dĀy/~]~]vMBa}%T\30º'k,+ʸw'J׍Ma@0#x2tdhNGݡ2xC/mMO'"HB`بarתz7>Ho.&6>A[_\ : Ux5;2{Uy{WQ ıyTz$y]_}5Rծ[F0z0:n~B[QC2w+8N"PdwʂzG4pC"]~,\6L`r\˲dꪝ]``AIgO9VW1QuL8mŢ-șDQ;l!kF~AeAEy|qcގ ,!dL׮YuDb}~8fݯ&MJm6/'iOskV*]͗=Re_`Bl49:0 hlLwz&&48X=!vv:HJP$x RͭyVaM*!)'F զ"J.|b1&`lȆFp9:D q'GwaE^E&ͩ+pcKw׎d^Y+](Wz쎯oVg-8%:{ӂBXg Jx<&P-οΒ`-TdUB㓻=;gzJAL8]#;`gXhg+px7r}4¤i[Fh]CU&jds n`8MdokTxyxˆL-yc0ڒ#7L:aꀭύ/NZ endstream endobj 1876 0 obj << /Length 1900 /Filter /FlateDecode >> stream xKsF_K'"}Hڤtv֞%> "D%M}} I@K'в{?<|vy{v`dR2Bqv}$`$8/#O&85!G@O ΰ%ʑ7bQj0b*Q 鿉̎}E,ɬҼ|La'MvHȱFceS :x9I)h oCbD u &Y\D{((9s7}if0_Q1oD8>,d d)\=[4xa~]-rjv4Kqؚ XxY "\vx ą im~ bXB-:[ JDn`D j;:7H3}7wRYm<$\&1gY}g|pIdx[ռ^1b$MT`Qte2i۱ sږIRζ .K:.NcL*Me8ȹRB9ϵӽG[[ W:Kj˫;`׎V[m#N?D1_g9m &= (WI؄to,D<)^? $,t7)`2@yF(̜z'EzgS]euP#Q\>K7@CH/yZ$6o:kMv]2YsÅ kC5A q8tB }VB$E(Yȏqq DxQ|aK''Wx}C:oӓ*p ڼk2u69TqU(H9f*ʚΦZ98ouQT ۮI;8 Q(YRur¦YtMh{As~}oFzGݚFz+tr@tNk: AQʄaaiyfXhNj2sJ8~ܕcs |QPM5B^II eXNboaauZ&Y2מ뀽EbQ1:Eyd,:.T0} c2_.8}5Tg$ʀ}viOs1F/@vML?E(cEyBzhVci|s]̵yhm^M6;M mɎ^ʼg'|B.yҥ-}z@[x;Eekۘ8IhwB gM升Q "QfG$PQޟaj_'ոAݵb` L5Y۾)* ^ # ٪~J L:`|Hw ,c}+jTdځɰnlw.E$Nb@\vOp+ endstream endobj 1883 0 obj << /Length 2129 /Filter /FlateDecode >> stream x[[sD~ϯR} 3&m` 00!J,;b|%'I*%ԙ>i>:gw.{{7PxR FG@yw{58TAP&Ø CES7x[q:2 XVhU O(S;^)ˡsb쪐244U np'm`|z4 @>lf5V]u%*ZѵZƠR7u&>Ons)"HÌd9Ijm0Ɵ(J{l/4d6no}]&VCVDVJ^R_s-xI\@\O͚o-Ӹ2٪Z%p^Oo啣X_!`U6]^قY~,Q*>0`V-^NO}.F[~.[=ٞZv&x>kz؈V1u4pj&nl^(A7ǡ%k2ei~ :ΊvC+G]w *[}?/mE|-eV3W;#vKɉ˷vuo}yRhؒ%EQS:t{7r=8?3qNTq [RF {[}gIU'=o=k9u1hK'`Y8JN W "8Xw^pDr>o? v,j'l+_W˩MjX𩺎34}-Jc_݇$3IjRc-LCb#< 058Հ.> 5j9 vj:VϻKM#iJ;Ne|6k8807 '^( HS_]5 dԴ@|M4ЬdFY[]>4kUZGVuȿLR Јq 6[^ZC6,?,MZVQ6q^$7/`J\{Agn!p妋UWJε }v?6X,jPFHl] $( HҶL:2+Xxƞ6DfMAa.JP)9K$I4G9'q%zl|i6z-2ۺʰtpsw֝IٖF$q|=8zo zNp3= p({M5wqd*tD&M͋2Ҁg3:M{]gǵ+/t endstream endobj 1889 0 obj << /Length 2235 /Filter /FlateDecode >> stream xZ[o~ϯ p*_!=. )((RXd@qڃ3]^(rP?+rv.3ΐuѓsqD2Bb))e2~Ypd2V,^,cxfiG,~~%\H le,#>942H*-q\S#.&3}& yab$WuM1cfl둿n`ÈREO.xfᯛ2G' -J֟Yqi>颞H@ҵ%eGM[c G{c<?ӊ@"A#1wDN/;($_|LY+w=7\PƍUwuS^X޸6OݶޮIbIozșFڗ;sWb  ω@ nMYT(v{RxbŽR$t>WѣPW+12n C77BWS\J}]} ?#4bRs`9ǫ2**?} 33;;[_c ? NX68mM sY8O0V 1Hzg tY"u,ּX@afIb' F_ٕ{(Ş-8ncg2v d ȝ#gJֲP 5~0‡z@\Ԩf?A:^E!PVixMhPjx'ѣvkk +fpM[ 1ÿPx;W.p8nL%;cy=9h;;Oh|O G) ׷IiU # 銠`BLzx5C;XGUGhU4ȣ;uA _|SE= V8y]%g#pA; ]_=82pK!ۉꁐCIy9W2 I6X?pq$hph1i3PO^=_T* S V6rDpx|Kue_ !YZHՌdgdxȡErԢW!FƢ[ 90HX 5>GvP%';*u!;3oZ9A$#BgyIj;KOEf.?$&> <6AN) r#DuN16p$M'x!l%Đ`->}sTg]a9Tzi~Ȑ'E`3S ,LlṈ S[Z2U 7Yw}S}\MfͶ߾f;BP ?,ceh\jmP &m0)[a@ia;.\TT$M($994׺3 Bw^^V%/K[;*-73v(;TkorPD[5h,Ðr;w@h> stream xڵX[sF~`Z}WLg}tRI2#GȮ{v $탳|KhG{/nW1Fbxo3%\tԷte HQb4u \%DFo|,O~w*.h0ZWjjD`CQVP+ZzO@Qb(]~s8@~Z(7䭰%ϜшՁpEyy^Th7ia9~ ܝ( &̞F.Zگjj+oQmn65- 9jJ(z15> E lBx{"iHyZ$;-G.BɈd2D xY(`#NR5 ӧd}J7a*|Wē,- WYY<.?eǴjƸ/_oёl1!lMt[w4X[H"ܬm0y=O _VYħ,rꆀ3U{"l,a]yZ%YЎ*+rx 6 TmgX@_ ʧkʇ R*bbXZ4Y}KRҐ_ k4^F] aNdk6Qva΁C$I.Ph3#׸.!xr}~M3 7QpƱfy=lw0@-0ۙMd0 17P־p[nq6Nq7 r8dmL`$"YWEͩ 9dP0aIH#t+4{)uo>0 ËMÃ7x;j endstream endobj 1903 0 obj << /Length 1935 /Filter /FlateDecode >> stream xZoF _ًu/$MCŖkZcC_bɉÀ:IG;"y={s5Gln=EͤwC"wr F7[%@`]"'a5=y 9Eq{ufEWsX;0LO|QI5ĢE1ֳq4,XdZ%9;'3/+9哓e#GaN>i:mzBmrWiG3Q63(_J<~Y'msEE#7x~<)aPȟqF10+ 6|%Dmͣ-k|~>սPV4Nŵk-6ƣtYA\T|a P_K@6m4Fa8sa~&r$ %$M{0J2Ku@OcCu[}L~Y?̰?0lc-7@|P,)@vTer\c(r[ź0" vG+hsM%D U8"q#! Cѐo@O<X?Z+FdÄahW"&u| -@zo)î{"]q\waJ>%;Xʕ_*RW=r*1x\\ys`4XyU Ҡ/Q#擀_ K i=fw1д4tGR~ DI9ll2ir;o$9ήQzv)))Q}x ߿t6Ay&8~'Sȡa{7Ndfy37߇?o~c'@pQ|kf(E#)%\F& β.T: 2-`H"_gW"':lAL+UcO/Z-:Hb(Rwɺa0MRn!?g0Ԧ6 ttSjfȄ()MD<]zŃJ Sr-:iemLVMkjbCi9؂( ]f*xxAPZ:~G Ì dȡkf&IcO*w};ro`ȑ5kCTc̹wP6Q8ENȵ >HBm08'Ƭ!j=dgI*9,f-\ >Y S;UůbEV04'TߦaY$ô}`y̮gtKU}X\wa`wlLnB%  Uo"\6R8Uop9|J Zd- U3%sv :H&?2ewo[0;$/i'ۓh$ӓ7CBjtX :Н+lvF8OthhVT-r3 zv%OjUo!;9Zm{Z#RM Q|W|wvr֚f8odHlȇ+\ gāv?+wyǕ#zE'> stream x]SF_I.}H' I[ƒl F\Ia2ݻ=ɒcH萼V{{wuc9O;/F;'Է(%2ktmIf'{hj]>]~(iq.K>}uϙg Kz>T(vZTF]P+\}.̾Pׇ]p9<{Lw=jlj=g'Y"dK8,L\z %I aߓ HD 3dޕ565m$<,,5f)oIY8 }adj|;+*S۩ b{a-J#+uhHh]Q$` '(8ax++vhS0!)+< 6(B4Ky<-TA/AxZpg϶qx C aGavZ}Kve8  ) `g`FxQK$i'ar;H w~Êmr|KHw(AjӠ--^mܥWCFr*v5fUP#ce66uSKs̴7Z9/}ׅ]*Rm[ΚfT\Ӎia0ǭ) ӧp׵C#4ζJ}KhAYDY*<w=B:&<)Px0{h!рb.duY S$qN7"ĭ$ژRr+$:@_H)ES(U^M|ikʁLTXO(:{{cy26.gK^k8wvBVy*e.7̣ :̼Y}|ZxY%~i('UѼ&Vr"yTFy&Z9=?}=:}u}Bkl,=WVq8N u n}SDdCj'+n }M@vK+z3GE(5DQP o|mqOx<+B7IMe*j_8#`[go kڡydz+Kk\ZhuZ_:JH%eRj&YMӀ!֣}٘phU_jbԈfvi<5uf WcUt/eRӠ8cڗ6ep8,VIBbY=DCs~>{qؑ\Tay1pujYBZ-YAU`%Avp޶^xvn̶ďM:\Ь]kG45?b[+0֠!iСL ޛ0Vܿ{Ħ,[p}&Kvq2u!L*V,M\JpI'<0)th @UEGqE{Q5tpoY-kc[*G7:J:;nl܈|mv9sIW Ue A֖+}D3alӢiñ*`$SU*Y3~l`o=h~nJùuW\h/36s{AҺ5-*|UMԼF|<۝[ endstream endobj 1799 0 obj << /Type /ObjStm /N 100 /First 972 /Length 2186 /Filter /FlateDecode >> stream xZKoGW-6!c1bXZ AD̊"e~դdpА gUuUHQ(#%4:Ia($8E) -̓ bKoڂ]|(#6ZxX`0JLym0xC~! %xm`A!B7፸`A§ĂF+bDA`2(b|Z~@ 1!&|Lte!f3k{C!QGΌ&zFS [AJYln»y rAV^t Z"O Bܤjd0CPQ!h@Ld:ܳ},)ۉbCTo% ҟD˿~(=^|B*alr׈SQ ;6qY..kv"OO`qHs"F-/97@jRhq+D !Dɾ4v bWgy݈KQ}|{&O]5`G}Rv]3eS=φ|hA\䞼41e+0 +}w7bg&_4Idv]2}UX\B!h)DTVPip:Ƞ5^ggb"`<%gJIF(S ˿c}/' 1fIv'Ck”-6oy2̅ű3W㺷RYK ³+1)4E\zPxɔ"<x43^:=iwUg947r>ɛl2P9;OU=nM3}يgmwq8ݜķp[`JϞLZESo,dj!&&,#fvoDMmM}^garXG8q3Lz&rvłp[^l$ڍ6z'$DLȈ$[϶Eoua$5.y]FY X?V"cۓ~Xċwn&f> %dASo3 }:(4ѻW|70EbⅳY]W^C'?~}2~Տ߭ڊrcNEDn8"*$хvGϸˈ,` ~!#] 3%܉嗼˲hTɑ5ʄF^KIYNWj *dƼ`q޹90=~^q5<۲=Y[rp넣շ߱`::XgvD7_73&p_ O+oˊ5$t^;[; MLx>ֵ6u֝N 8EsTt^ؗ"GqIJ7^")tUHZz]ϕDeP5iAyGhzϐ.7=bMh^Q|LCPuG 9}]SXBr{je%/"B+ri cl7KezIG=*t󩜑_5|KQc;'jyPf=A.>{ޜϋAK[{dNk%{`JH=<pg4}b?@vحJhC+5p<ۻ"**%ࢨ#0bm.ёNuRzqP:h&gJoPA`Y+GWjy h7&#!,1Nу|s.eb8$/r~Z"j#w/+zW[1{NOsz>tv:p;rhom[FJ^!uzh m|_vxDB ;{rq"7Dr=$gC#\6w&sRnB,K(Wv? endstream endobj 1915 0 obj << /Length 1564 /Filter /FlateDecode >> stream x]OH_7;U=ݥO=dӚ&vdBUoֻvlcR%~0;;=>oAGHґ |D7-F8&ng q>|l@1p!LP :rE[sכ1 EPT/䯷7bFDKm8$A )CAT@h7n7)>N: PMzR?rAGp C4YON&1l1a<eW0d7M YgWmSrpϻA\xL ̿"wkwl&zJq_͇>~,κ1{xhuIVYPK}ʄ0$$9?)$eQBާMozK$ 8#̃ Q)\@$ZM +{ 販  o0p|^!x)G{ ȧÝHq:F7dy$%GVscj]HDp?s-,e>pUCf'Otڬ_blQoF\Xt6=::^H[A]q[0rQW4#cvScbM| JR;Wik#R[Ie h8 'U,dm &|&ѩ@D'L|:1ɒdp8dl'qVcMqC%&n$iץcΣpQΫ)B뉇yɎ*ۉ7GøeIɭ =Eu!"J鴴 i˙;1 ҒS;(d<*B{P9NyBM:֮.e2"IϹA"IwnXF:blm +G^0 CF(dB3/Eer#M:) Z~4>$_xh$\Ȇ \\u*¬܌yyH]GvK#?t,zyJ4{r-u7'M\&D}X#|U| >9!zoB N l(Uj#-~nAAWobnMUv= tdZd`?fX!,'y|>zIh?@?Ծm=%@F(ئ)XW\ZD.=)333ù9{4؅ZV[h^>DC]1<+Ru:vHgv5C;#vtůncI!"m-][DN+WCfIW~sτoۏ#bdm+e<ϣ$d-F+'E՘#IUd6/׳Q endstream endobj 1921 0 obj << /Length 2115 /Filter /FlateDecode >> stream xZKܶWLbN_tXd99$I3,ϐ4J忧Rˑk,\ h4_wCW]yoYbWt oW?8\3HQ:'. A滛m_߮7{$q]ܹRA'P'tb#gt1>BB)Lf(uJ ֯*@nBzHHeX< "ղH,[ɖEh)Ew-ԥ9AAۤ v;QR]'TЌ60ha &ku)a ^8 \ӈUbK{ 8#Dm?L22-0WX+6D>`OED:k)Rt\"< ~E-D 璧QB 9zj6dy /Snb&r|&MR*QoC uv1,;E; G wxw1B<&{ ˻ }F>uMm"M'ik^,≬\nDOz*@gk!fh05,/O KrFz Z'~ p 0ȦU:5uϱ+t(zJjE(!xvXSwѱMgn~GOO@I>bH>eQr ٙ`YZ|$ /iE.?{vMxabjcN@Uf(=5a"x1Xƈfd-b>b aCb&3GCRKfM셙Ff,]MQ]OB!:y{8 _`Y8KdbۭU?+;Q@Xy蜒栳øƶopAexUmjqM[V#6LVevOO?vfua{9TC5,I84F56d9'<;]m%T>ަَt|O1~MG\CJHBȐppI'p o5pnUk5sEA!(F%pEWcE['i{ Z #QZA;&irkԾ7o9 X'ern2=5zp&DI/k: vts=١(s:Ey-G am'WÎ(okl-4n2Pӟ1];Xh#0K7V+3#Np;1B#J 45Ia j7V?XJ]۾cM58H&/{E_d/(I*FW~`Lߺ1;nT="N{-f)cF0В7F{?쵏 KcjZ6]7s$bP$9 g8cq i<&gFn2PF@q 7""oE rڄD:IW˧q뙽XCEQBU#zmsD>(CV:,6 ]BȣˠsGCjD }~"EL!hi6i#dL(͗] `PNS|| ^C5ܭ]O` uFů,Sѿ?f *sǖ*ҏ3o\MR*=X@ endstream endobj 1925 0 obj << /Length 1658 /Filter /FlateDecode >> stream xYKoFW9Q>-Z8p\hje3HA{gw)Ӗ,8N"kvfg曙]9ˁ3xK8JIlp>la,A('Cِɛ7g}&GJa{Mjўc  PzEkVYaڊeYEO=`kM~~%6wيدa[WѐZ8%I!*Y I=6*y;Tdq:/<AkƩ juh;+`^dVY4$Ϟ:Rt{ -jMX3K%hT ]I4] *зQ)~V?ykzէԢ ~5r_v]#NO?cc2b%΃SujHaG}k +rlfy91|մ YT*Y0HÞP4r}(.e&$ƥuh}%@'4*QX"A," >DhƎVQuYp(QP,34aA! }P((+~wc I2T$bo\o^Rl^Jnj)W$ L' 4 mFI7Ӥ^h6T mۭ o,P8yW8ҎOG`YZ>qz,'QмCZ8׸]ٻ14$ACDeh:VTWC.}^.+*})db3y&]?B'v?2KgO= _ ေcq4[p,"h7p6UvM/8nqx @7. 8< qDg%fW؜:$ࢋ̨ٓBʉ+vcf6: +$`ͽZnq  ƁaM5Nn멙5[ڣc)zzk{~Ȁ}v6:v)SU"b ɃĪ/1}h+&n/MOВz>\~X-/Q*|:v,4_ȻëkndX~eXpzEIgu2HB2~0E?U\wH41 ;@tMz&! \Anx[p ^;Oϻy:Үoĥa)d+1FzKS?!QVNbZeHAbZ("c&Pj<-Io;x)my,gdTw I!$&!ݤ|¢?ɉy#nzRH}pm+>V?V? 5Aqbbfh1}⸝]la*A>6XF}e=>ꤺsk7ȴhpp_3#E[ŢňXBb`*zu{ƼCxݠ|wbCJXnqiuO]X˵p'gE~&hfxJ2l]x1Uvd3Kv˙9Z?gesd} 76g%U>7y?89k endstream endobj 1930 0 obj << /Length 1506 /Filter /FlateDecode >> stream xXKs6Wh&iBēT܌4i&dqr`$(fB Iv3HPdŽ!X~],>|~c4 fA@$Dl1baxTZ/~z3)CF@B2K8%#mc`LBDh,| 8-=/@=7 =f F9cCP{pM;8TU43wmoڃQVc/DĈmo `Zc'&2BG91 sb uuL`4<_8 ˿p[8.LfxB;rrV{.xw;W{߷كqqj#Dz6(TWy7iO΀tRxTmѐlI6MuCwi/aj{4J4>7RaI0yTf9X)"1 U |}uEY:JFe ʖ0h%VUTV;KkmG$ʹ[Z0&85LXqA~y90`&*\$BUELթ0Zuxt׊ȐU2KJPr QW4cT.*ᓪ|q+uWxpa_TKU%lˁŝ 'B'@W҃.Un(daXorvsY|Dl Cd0gllY|wc8!RZϳaϟS}81iMƷ4Z dH.\GV ޢe.R>\GufvK3f͈r ([t\Ǭ^dž#piJ,.ţuB-'^de_eYf U2ve*5Pjq%q> stream xYo6~_!Y-FHJJmt,b@E#II2b^LQ"wі`Xƻ7ӳlYcӹ\DlnLgEsxt9qFWwܞ6t~}}?OQ$80 ,ō jI\dӭMP]?᲌VQ䧳$NV@GB⸣2 Z&S҆9[Mݷȥv5( 6bS&\x'SXtQ(M>#i\X- P6 gQ{.C^饮!1U(FoVF2h 6]&!0mϡN {!@Rֵ2a`CHhTmVOe)Pk$iZ0؞B?qoZie>S9c* T]aa/ YxC]X{bٕt YQu$`mr8Y.KqpÏ_fB$7&l7rxS ypiEPM(o+DCCNjiCˡy\a]٫:}nThO0˧G;R=-8ɖ @jB>(,fA$,<1DZkϸz@@*W/Րx9NTI:އ L>N96ȷ#Lb!++E R?ECty!r:kK*B'G暆TͬHl$&"`Zyj k2Q(05@6^mިR xۼ-4Ոt+1X3~o./+ߩ7t`?f# g$LVQ'a@$kW:@-2tHse"|vKTS8e|_ ]e?rJVXz,_ i:a [3+bOb怠~xHv<߽9ջ2aw@Ol{9$KpݬA.H4ƕ&6viR:5~sb{ClMhD@L*}Mj:pWi :irδ: Yk>Y$^Qa6C">/Bٓgt: t{ge-e Qֶ`I|tsTrZ.O$h/Sv/`Uq%4N, /q%xI'BUN2!wrY8ډH2 kcwiIf*, œ.U 5F @Յ C[Z]G /MG teQ;ŽK|]Mͳ|(Bڲ'q4獡Tjw uhԻݍ$GYg3WIfWŏv?]ǴՁc?ihFxn&y#lVZ>L9XUM\˔#**)i o:7Liڙxh`'_"_B꾚0XX;Qu7߯g-Է.K]9q٭.1]oY$Y=Aܽ9pOA}?`p?l endstream endobj 1940 0 obj << /Length 811 /Filter /FlateDecode >> stream xڕVko0_}ImAI@ifӦmB0jHt_?'I!s}`<x{1/no@hpm 1| ٞo=S4raQSwy8]My=¾z/%NMe"߲7`lWr=\Cd@` %gliM^(-7b5&] )#1&DP%Qka\ eY%[VuAg&xPT؏e=rB 6ΊtуFK7^~ܔ2z•{:r90<{3KSQ"VKT߅8@4N:nH,8 \p![wh0Yh`~9MʜEҏfgZysKd{<%ړ oFR@6D8~s-\PNx|!GW$ )(%JKJ]9'Ts`ݐ'Z+􈏧d 6>0\sI(Ոg(7:*8/n1+MSx)XW$֎OFy9lvt~ZyX]=[D5!B`"v^Kw Jq*AIs?Cpc9~)ͨ6r*6XEioj-dv]U"TS| yu&X,=JQႪʔYUѾQ?wWsOJDǘW1I}YWk>3 /d endstream endobj 1946 0 obj << /Length 1250 /Filter /FlateDecode >> stream xWKF+ vdGCn3<+~ frX)BM몯VF??F(Qh%4#b~-uf$fd>4cb^lv*k6+#gI( $ptjIL0uYr@j{JĨ7緬-*[H$lWn5onծ3'NuBոvylMuw yr`oĀL#Y' 4!)J$y, ;a$QL8;9<5%:߸&[XE]fn026X N$HqҙlE9d1UN j"{VsšԢ1.[\PĴ md" gfk…aŅ[5ҭleXX{r TބQ; 2w"Pl۞F&>0@RA?F0H#122H})A*">,t4FWH%#DV" 1w`=IԔLr.^1وIgPW/),m\hi_uz~/%\OtL܁Gv>q!M_C&Om[5$Gם?:w-zX<@㡫t31l=bQ fnO 6 H@BrXMfWvX5drO;| tGn>/Font << /R10 1951 0 R/R8 1952 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 1958 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 119 >> stream xcd`ab`ddds,L~H3f3ECCaI# L@`͜uDɰ!ˍw>l@sy8i? endstream endobj 1961 0 obj << /Length 1888 /Filter /FlateDecode >> stream xZs6 _ۓ=[,?E]unyOiْ'M%K;[mC,A?~jW,0Fb`v1|pf0w658/y(<*2 tȇߟ |}QĆoxm>^H7#+"MXG0l Phk_.iv ˁ,Y7K']z۲b~J.i:OJS;J$*Y:wŞ)2B%bC7HݞQ{ٽuJxo$Xҫx4E{#m(Dܬʯo]e!QVPIמ1>AH\7=9Rc+p畹bua4ϐ.[TRͦŞ_$?bw!uۻEJA"xc"Rk!x6+B!;Sap⠹Fp7WW9LQ@/=2܏i]Y8fL~s6[$ ΠD !.Dc?}|^t.hbPȼ^/Xa0r5[Ѯ6ϖ#-b!kaa0KPyD(:''gtlk\AHȌR݄"փܰf'@ ^Q[ͻIϲNzSg[lADQvuǻ?!Z>Z%f5߲W#GJi/Ḛ=$>"ٮ*|uv6)y긥iy]!:՜!o"/dY޽CAԮYuFAH9 &&LkbAJ\i¢Ujd7K-тپ sD C s ؔ~)Lla[tӳ3}m"+; ÕCqhV:YY%Yc{^v?i5}{fO\Y,u/N<+B{8Bwr<~^BYuf#( &߽8I ئ:<so _Y;;0&0V";Rg:'d>H4N3ك'fP{SDȐ׽=U|Q0 2_Ţ)25s>Rw3 k?3 |ݤfnϞHe0%:ҴID(2 J3BU%*Tj5CAs%39 Ϸrs W Äu^9no~~;]ٟX*"`}+>q=YF/v[Z{-b;L3P>ѣE~ѶvnU]㡟;G'@Ha}wx]E>ymyv)[?vn6)uV?)ن-%Y~P#I4,Gv- 2[})Xq= ==ဍ+v(zۚuSO>3x(b{`GX|((=^=ǟڱ:|LCbb#>^Z,Xt #°",{8&Bs*ԽłL4w=&JO-wPB&*$w A!R}}*َQ^j8%Qr] qU9Glxȣ#pٳ$6 endstream endobj 1974 0 obj << /Length 2138 /Filter /FlateDecode >> stream xZms_K$;^k2oI&CYċD$u R YrΙK&@,g"ۓONήc$"LAƒ$U8̂È02'1 ߼7?Ƃ'~`:qx}?凯Go߿<fP d`Pg,L4>FAJҘq`ҙ9=D"aa܉ή$P2hzO4=e`cJ |8xS3OyBTDJTW;4پn@`Mj2/ ]Y~px"BC;ah"S:*X󣭷Zoa VaV//8j܂ P>AOzѠz70fuF;~GtS.˛hhEDT f"AWY> }JR-|5[zlgo'Ƭ^P \)R+u Fcnr<_l*#"{Bx"l>~kYոeVcҋtiجr0~OIv7H_C+\6 ɟfr⢁'YJ"`7IE^gW(<'k"cP;Ej9 ~ILJ.(\h^oVM~;bJ#ٜB\&aY ^FV\P^ ]y'0 \⽸8,z y FWYg9t 7,5j wn<+UX_>̣* 0 duYkl7ˬi[լ\gӑOX8$da bvj @QӸ 73B9N[T]勥YQcbǞcISc$mPqnUVv`ͪlkg6M1˪G8afyL$gUq$pSfC&--O ~0! AO@ 敼CkS3]pB)Bc>bn{>fI,3ft]tw vlʑ~8xSO() T^x{@Pɱc=pp_ȧ'b,`WW$vzL<"*68MLqO26䮥1WJ +^ޮƻZiq'FDs Q1,H 3$eb`[턠,|Bp {C'IW|D>30[%B-'T-k8hg *&Oͻ_DELT#T@GVn{A zZjUdNd-9UFEp ] ]F}o:Ю-%ʵ\{0r7K|Hŷs"[ɼS .YՖ4ۢT9y]Uq q6b ; S!pT&s}3R p ݾQ']ۊk_{j"YϮgJijɵox}%x^oM&Vߏl:B إA>ۿ})M6GX42~ɖx\z G,cܬG]ѫeM7y1oM,3}2TWM~zYnV3l;) 0S-w”=sE?`\-MkXc#AD T>cl ^xN ^8cIk*C7zmC&+W*z7 ֯EA@O]~V'8ļ˦n]SZge=~h`$ -R/#9X> stream x+2T0B˥kbP endstream endobj 1965 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/multiendborder.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1980 0 R /BBox [0 0 595 421] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1981 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 TA 2}ZΕ<^4}7HdP͚HgQb y}}n,J$PͺOgQbun,J$Vm(q>'}7%ԩmwcD|yf(qin,J7ja:{ƢDxw>FSGQ| w]HoȂG1bģzϿZ endstream endobj 1968 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 594.999 420.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 1982 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kbP  endstream endobj 1967 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/multiendmesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1983 0 R /BBox [0 0 595 421] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1984 0 R >>>> /Length 11975 /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,Ixį1\zXOWP9җ3s%WВYCLTR mV;Mq x+>(KTuDEcK h׻-EM43C xIxj폠Enr. XjQ@2~2)K@pTSezl ,Ogӣ91Dh0?L: |f:tgq>ە>ݛuc&|)TZ??GwEWg1"uc&:|w^q|=F2[/z0#Hf dĹ(CP"([$ W^P*oH({!>1=Jt큃S6 CFd T53i0tH"CϜI:v61'ho6:tH؂@7!>Wyrn.$[%dN4@L SKlD T^q^|Aԕ ڬڦVij,9`=F Po=^qTʁ^fNU T9/0)]9I]7I+[گ@GV r}dL. mALe.Ħih0j:Yoׄ`E?ђFʿ1+\עu`|pxKÉkh]KR͓V^4ԨT <D)P*ShJҘ1bjUSj#?;9z_9|6b*E"rJ#2gDe@} '1[M}KJ}  ͵X ۹Cm9Բ7r)[S1&PL=BHȝJ]/:j5J/sH't0W=%)j.w ;Wƥxk}w@KHzU?gլت)θL׵M/fNXBln4ga%1e*SA{X`J*c)V–Io 0{/=EP E+͕-El[ȱ*OJY\ҺfrkC vP{vl Ŕ/G(_jL;apkvZWT^V;hmƥ=6ѨkߪB%S]qjjN򥱗vU}}/B=f,s?hf-#Z"T?zw K&霕Q:~גMIYϭr_슬|kd(?hGb{ J%BpӰm#n|8d(.sZfJz)DWu{dWIuT ^BYm)_Fbd u|cl=0G z`0װQȴګ=,m@5'95a*ӟ~, }q%ݭvwAPMJãTl#ecwz6mdյqjIwUiK(UcKQlG1jߔ1RTJMs_cz7_z]5of|M>41.jqDϴ79lЬ (]rZNSK&jւR1:kA#//R:hrWluAfo}.:>WJEGUTGG{zHk?2}w{wϧփevg=1wIc~iT-oioyLNj.]ɍq_ _!B> \<*b+`&rbލe]aK. )0@KCW9x*`&r. E+%/SE@SEy E+`&uP0C UKW!F+k2.Q CYEt;c!>դZRE)5{5H^ófѕ\w6qKhM zri`鑷_^s7Zܔ4w? ܙˉvDax t ;Ӿosې`h0Of#ZLOx'?XW?J$RmSP[&R(R$tv0[4Du2ն.gи"p_k&1%(%P(FCIˇ[ R10BW 廒e( Db^s8eͳƾ)/̽"H/ .D3ed¸A20[z:VszV_Ņ@)&"rNзsU/upRoK .SFՍM="~#Z#,{vd #d몳8A局Ge$GǑ(b(_4>Qė@#Xj7K]!(*BL j#$T .xb@>` ?ђu\1XjB^ l3^l,+8Fvq>Rվv:bF)  _c_2E eC~>\;fZқ8(VyXZtDH(B$Yy(f Usx #@F#44IۖbؚQ:rI(r8䁔B."9aJW#} *߂LЁ U]p۴y?jR_ #~-B#ނIc0AB x1c5=+eAĄTu"VTj|up*7uy>RdEdܻ'Sx!Dt #PxBϻpSFgk/1Tb-ÀvEK8A^ 2!'ɷ7oFo܃EP =@O)SBhAIN4W-@=zz"T\AFr#T[Ky T^IoTk4x _[%5$uqDzFo_Pӵ.Y{Kˆ]J%@=bJч\Q&Y֐L֨LO7g@Qm1%cGWpmo+N?4C iqRa, (CꭦrmNx@`[E̯eW?7izL僯TOq~M\hFK^+x eZ_Z716 _4/ExZӽ#9!~3 ~ [o%"3!Mݼ\ R(-13_3!Di 2*;$JZS{A)pw..u_ޜoyLER"WgX}ճOH| SL2`/ /%!#ń<1g5o@ J"Ƞ$ S膝ɦ OQykiYlz8, I2$lyqUn8Ҧy˻q4/2D+{̯]#,nL x֗U̯eC؟YK:q~`=^6FkxH"%P7_fiHb㺝wgm_OV ӏSFz YdzHL?U }qCwBƺCѾ s E*0/A:J%z_>{+ZE U_+K7G:?;K W0/~&;p-(ۘ`{$jѶ**0Y2lI_}~тسi^+vYijlE+Rȗۊx@^*x*$0â'0.\wPi cT=Ve~hKr*,PV^ h ZPYڥV7:*ޯ \a+X;޲jQCj:n]&`t3J3)ėBUUfs4ܷǐsjxӠPvi?ܸ^rkJR̯%QT(RG\E{+KǡR~,᱘q-(]kweS&SS=Sy)֪ȼsNVP KyE hI'5RþVP[iVTi7dߢn|=tr]0|a/.>W*{(jØxC=3Ŕ/QTWhkPCz<_UwewϚx=+E~k(L Pq%3QdxZħcT.Kf"lūۮ:x#?!/)͢9 J}Dьx =0-ר\5) jn4*2M5Cc 97KCV _u@]s}KҜޙeXU5A=K#ҾKkHm?ƨ}勴l4Ohj; CV! QM.FBEk_W=)HC]"̀~:VbF4Qx27~>: ޘ [>EpDd7%-:4|kڴ xW6)LCZlxA]aaYо)ɼ/57e[s̝a%U2= Sf*$'v.e^(Q@$j ^UjĖG<$S8гLK<ii;k)$s{7\3ziH|2%oct+3Zb s[K=HKϩas&ԿĽ݋BJk+J܂I [JjJF}{Դ@[LHQ-ֵ:`i̦!yx[Ӽ*ufUp'Yɯ/x[X%mKBێiAs/ɛ(ygj&K)樯,*3vX+E3u}ԫMv{7k&wkt(>{y:͍thUo'5d''(DSY&tZM6ܒw=Cr 7MtCu,:]/2-)xGF-pWPX@?PJkt'Ew-\xW\w`&|$/#3&& rܰO%aoXi}^L7im1NXܧe/5a&PRR$mr/"`g(kDQו"ko-!wBDU& x'TL?tCͻϼ!ϿE]ti}%l -?740thFAR9(Mt<(wP5 -09 k!=3O;A}P)zER|}DMJVzp==U "j УA=zc0A]cɁTOqo8WsD='K{{rsWƳo-6g"GtB_ٸm"9ᠯʋ~FsԿ߶_nOԿ[C?ZXX[Կ[p -8] ~=($^n[4O)Bvg}LCٗofp c4-ݑAuߊM;ЅnS i)thS i^ZY۪/륋l2h\LUt!^LOJ>,(AUAz>>n/_DrKM-fKDHj)Z PAZ{KA=cA=V,TsA¥zw"TNWMXN-+[IT8*O%fRy:am"}>e\79U+07Jϩ gԪy ~M%e9bYcu<Mtr+ *9Ϛ6:!ON|Ąƀ! O>3ṙ = !I6R{2KCm Pm P ?덩?+xAc)ڇbI|H-cO>kCYUEP3j}U#)Wl؜O)Ӿ'~@F;eo 1jFHZ4djmjV7#YӾ0k@(ULuS5V¯w6X?k( endstream endobj 1994 0 obj << /Length 1801 /Filter /FlateDecode >> stream x]s6ݿ'1a|p̥m(xHn߻ if:ǃbo+D4z}3c*ţu(p*%|?!)1G_8z7Kױ"$<{뫷W゙ C¶:tJNh9huMF'4I<p0 H"-,Z*nvM+-_)TCSՌquE]GbgVYsQ=eWt1&{2t-Rѻ=ړiĦ!&[PVx#ZEvg7JӣT=b0>㄁CnI^{%gD(si+^< Qy'Y5 |cU7.@@ɢi-nNBz]7S槄Ko}=m3ax4BM,k = vH`ͶERF _qT:wI ӃT Y\M9GfWVE2 nye,weu]g8VKgBS;X_6( q? uX/U[`Q m!x[&4*Wr*LUu'oPv de[O7E+GX5!d {ysXcP)wRj &i&Y=MFw,"!A ág'1we(_ mz[`TRn'D^xe[TG$C^^?|&373ggr/A0IL&ڳISRY&€a %V ia}g1rA,\K1 ΨdV!kf9XϡJX%y۲<]G`Q7&o׏ip7 NgIiGUs0|s|ZKB~D =MR|~FkxA E88,#܈q0/-1c =ȿR@& HEayϊmɷ08τЄq:4JlRD=z4z[~hvx ~1l_2jpBSKXxȿ;| l][AXX,gNZ|f]{DAW#>vC0lT*Gw}sCu8 1>(*2TMKsg;V .mO'e. m >{Cp+>C &u۵K)c P8̜+pv]+OT 9<r)#ڈ3„^Rr=WVn Or]Yd1l wĤ_.DN'3< ;#Iz s%s>'c7 8x`8kBuY\uUI, =pV|-P~pUs.~92pJ*嬀!^1Jߺuu3}gUw_7z =WgXDڴ݀|$Mmc.mjr2q: $t endstream endobj 1989 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 343.999 343.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2000 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kbP. endstream endobj 1988 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Thwithouthole.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2001 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2002 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 1991 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 343.999 343.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2003 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kbP5 endstream endobj 1990 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Thwithhole.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2004 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2005 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 1970 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/border.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2006 0 R /BBox [0 0 561 170] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2007 0 R >>/Font << /R8 2008 0 R/R20 2009 0 R/R10 2010 0 R/R14 2011 0 R/R12 2012 0 R/R18 2013 0 R/R16 2014 0 R>> >> /Length 3533 /Filter /FlateDecode >> stream xZK ϯK sW@OvPɿOU{f]NO?"Yd7껶퟇j~;-n:0j-XڷX{սbۓBii`]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`br0q6쟿: 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 *2}ƸNF.{?NoN6":J1b^u:,H=! (i%']؝Mfeë{@l̲_^l/_rkpEk Kx!Lny{5IO8K+tQ]FP9o%[%!X^A+4./WDQ<KU,I*[% dGR}+ݐ|(ڿ [B (D"2Ab:b_I)l:^ n:f'.Qzn5pcu( `ƤOEW|*ƽ#2{"ÑM5Ȩe"x&# K\1> 3`vdy GGdNAkg?W,36} R/^uؕD%!օ7nѧ_;7≈5}rDwj˗G^P>Z#Q7Ǽ,P E%K ń[cI_xMI'39jWQ|"q7Eh٫Ţ?<`*|ξ]'?߲hv|y (7e8[ i|/O78KJe~#^g$GqL䏻F6N@X 7 ;qVQ`i7]de"a8Sbָٛ%g)ёMмG٭õm `r_3׬UblUz5],cOwfSkwtnd^ت/ְ {SZס6f&%XsV5V&,Zd[NZG? nj[|B{KG6>16^fWu=aS2:/J=éI_]R=AI)K7&%:-Vi@':v Ҁw"9+iM]j3$ȼ1GG;z/=s>\1OWn mc2ZT>ӒcL􄰋Nǫr>!T&Jj1$~=y+ؠgkmZ3g\MI»ƞjYIHOw,|%(ILTwZ9UaF>‡E>sCЪG!=WϿ|6/uR-m3wkX k#J8J/X1[vVB}C fedA> ȴvh[zg'IGhKrR*CV[;K6|nؙ_di2)U)?CrbQGQM9nrMy1g[0҃~OݩG_zl _o,Ob}<8lI1_6 X:nekuW[+_#{PVX,ޖ7!'Zy= #.C_ t8~_V}-k 㒫;z6 PM"W5s}V/ԯ+7TWԒ~2eP,QY}lY)6׏SB M9NvsJo.Y endstream endobj 2029 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 105 >> stream xcd`ab`ddu/H-wIL hf!D,r\ ,pB_?``j@nddbOcF7N) endstream endobj 2030 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 2031 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 2032 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 2033 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 2034 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 2035 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 109 >> stream xcd`ab`ddM-K-Mif!D,r\ ,pB``!fcHw>l@Sy8Ҿ endstream endobj 1912 0 obj << /Type /ObjStm /N 100 /First 981 /Length 2403 /Filter /FlateDecode >> stream xZmoF_ߚ(/o#EۤپغڒOq鿿g-JXp ٝgfgwRQ)! _11 k~)Dk"H h'R1 x"hID2%F*c2(LhR(<uYsOl̓,OQ`X>)YZVk @aNC"*VjZ د R:l%kI c-%/T7ah53!AKM*a(Yc圆/J 3l񒜆 C] )8B f) ZXrM@Gi %VXL k=(b'Rbl)-R<%ӒG,i [p9*2A!;^z ApDe1BP^T@Zql g Td! PxeV ~r// X)͑c" n`u5g!9@&kx;cmC,- e3dw[?Tx!.[B98ؐ z.o9-/f9E7sI<{v 9$#nY~<Sq.ϊSqٟ^.Vކp:ጓtj'dt72QgoA8g!]TG1 RFL %(=@eUWx1oe$CV>MzV}VgŁ]VQŃvV5;;fnVTc0xz+x%,+8/8Ļxگ4u5<}Ls)VǦF#k` ,xhlB`LH0:F=RlFl1bϱY͕CefZ=OTfP5O7ҭI(#pI8u/]xv8Mxp;*t0vzB<86x wR~m,g5&Yq;O?xt9}*ƽ۫A"^ /yW_GSj޿jeoR$we4 RP)`'Uo:nP_+FO5Wb0,˭i2ͨ}vz&PXma6?n:WLq9G؁ ؽ]N!'}nrp6)&~.dt9nh7.Vk,YӍ-1{rnj|'i|8&ْE l7eKkmzZlHYiޞ {p#K-Քc)\xBinZBlSu ~:U4&/ă9]."nEDp/àW<c3P!aEUqbąjP~ 2Pz"Y bӒsߺǿJii>cGj3۴-&#,pPTAoP1VZJ¸[qqupu##g_:˨ў4 h so6_܌}mf9C//v={5ɠʃdNzvb."#;Ԉ?aL\g fno*D 0 endstream endobj 2043 0 obj << /Length 2811 /Filter /FlateDecode >> stream xZs6~_u`'dk4K2}s %'TM EҐ%;6܋ Rbv[QpD룿( (%,8bĉ&|JBd+~޽P(|6`IyxTy>6D!KhVywgMdl=a:l܀r#mYQ #`gU(AF QnF؟K7H\WtYQg.ʽp,s20`//]{Ta?:, 1g4(q Jh1\Sw}dY7a}yp3A_/'&=OztX x(G1շapǛ{HWEFVIgq2>6CF1 &^cd563 IakH+!&#ejAi'ӞЄHqr)Ϩ4fߘg.m6bѫO#р=QD_`?‚AG\KOf/W1aY$-)0F/]Y^U4lmĿOx XUYUvB Dĝom\ 6y]gni:-u bÆa8 DYe@ځ?O&g3~7>c^,*eva &^= :z~=]ۭ`kf́C͔2EvtV6ߎco6c펜lHL2[B풁\k~//e{R71ԚPOylOG@-^Ԏp/߬`q/K(~;;VR('ePR$ T1sz_1).6yqQ=r(J%PΟެ:uvWXaΎ|]$at1R f}I|ilzP#r{32һ^:܏YH۫]oEQخX CIjF_*ɶ:4[=}%Դ- +Ѝ{E$#˦XےT0 wcGLy^\)yyt mDe,t bqgN޴\# t]L/܁Au)mom\d3bnܞc?d~9եm>G xe|܉)X/-.OTWY=^+-Yƺ(0>ݗxX3VcYqM77q endstream endobj 2039 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/mesh_sample.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2046 0 R /BBox [0 0 321 299] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2047 0 R >>/Font << /R10 2048 0 R/R8 2049 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[7dcQLlij0}<ᮢI- w#VuwEs- .MdW"rPN.chp"X\3L0i {w.CW.s^/)TxIK SG޻ALdjwaĖB@L+t `jdIN?#٩xMq4?+(\ɡw3> 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 2055 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 151 >> stream xcd`ab`ddds,L~H3f3ECCa]^# L@`܍  ;@L:|?~{ȰT'%&&s|wb篝;pfil|pfZV@. endstream endobj 2061 0 obj << /Length 2262 /Filter /FlateDecode >> stream x\K۸ϯ`͉G0ޏuIln6n+ő*(S{Ri EJԃq6:$Fw_8xpσoAF Ɓ2Q&(<za\FBZ˻׿ P^_Ir{׻{W+ {w/W0Mf0󫏟q0?1oyyEXAs|pi%fpoBFiP&4Y 00;;I087faQ* ~wOY)5=z[FpڙNs>p@U)"&DFO2zmӈѠk,]5ʂ~R#X5]V:8\uvЈJ>i gJ8`BHj;)Ux1xh,NMW= T*ES>_oL)Nyeq1gYd_0H Zv}VT »a5HroQ:I`9nS eFn`59E?o'IO*[ҷa _}Y2R;(hd{V} 8n[[[3Dߥ! t$4߳C[F5sMb3F.9)S6gs{o #șNWp&_#!-U`B%Zy0ڥ0S K{0OYk:w$L9J)>qԑӅ"%s.Cd2 1ZP#HBvs*8CuM&l]ԗ`|tuIGUUl+ RX)v+w~"4D#,X71s"O83=BwU~ܝxc$hڶM݅%U8ya8a]56Hf+ C܈S7l9#ED' ̋?ȃD:tNw3"˶@D ;DI^B*AO0}O>g"f,}ftj9yl΄Byk;h{Lbd뼊Yue|Xؓ5FD+u e8zCG#ךqhͱBB|MoMR+F0^fnl-?"e~o(NWMz[f*|?P _,fϮRk8N0vُs{=c_l㟶 z}i!)e|+ DW׾Dvמv>"Yw/_mvQM1ԼΪrV&ӡd<5J\\*J@3wohtң4r9OL4߸,^Lդp];pa[:w[Yx`zstq_ 58٘Ỹh?aA CF|C[XJKxJ8$]]]Fm'm'Hx$',pvo4ȿl@6{ZϷطuW~ON5Iu.a优K@f+q1\k·߶MSD[gR-QJ-RZGxO0ΦNrw\y;g8k%9=pl!S=[V؍;.&ue[t6YŰ+^O^rt._;qpI<&7Y%(c<ϮN?)S8+J6q#FDi ɵ{t_nΕo[ ?\OcptaDh+8 GL-8p\sB;_l"Y&ghΓ#l54cQ#[/Z#BB>"9-n刊퓧a!,T֢Z337G#H9O۹8O²1xƴēHz%N+JPB&(9FVzf/%KR(N:ťDq)Q/QP$ۧubZ6IV8*h~pGQG++?fK$|Q(etqwR'fe(Uw/saXO#(R8vXO:"XYu}@Ը?$9W+}Co^/%v endstream endobj 2067 0 obj << /Length 1850 /Filter /FlateDecode >> stream xZ[sF~ׯ`$5b, Qi팓6D"#!EN{ϲ,7!rm_ gsXjX{i9A0AiRm8,YXnq}٫tZ=Wow//_]yֳIwWo߀aB@c ND: S.uES,x`T7obB !{:ewW\܅uAAF2f^,YىXa  ԓIze=WO֓,4IϽ&(FgpK.jMO IO s l yJ6fM&?nP(F)˜a 9Iq[*^AINpV"*{tEeOй;Gm-YȦIsFiNrH ZiuslQgP`^O=%P9T ^)'~0NJ[Md)׊"q;jTvK閵A}A , bWG`#L*(8;FJuT$\QLۖ"mmG dd bT֨MaiC:Cdvdjwqa꟰8adi9axKG1%F ʑ)|q5%TR!1 шc!LNѢs}1 H5c@\{CU]3VqUˍ+b fI'܃|`|@+b3d 8IL:Ilf74Xsw+"-8qǡm0j]')h=hqmẗ́ ]OM 3{tyocêzHK Z>re}+rI2V.KZI;R|wn}ә-m}S$}xv-1ZQeڕhXp'NFHUjLn#5RcƊ"5ZRcRԸ?B#:-Kx,5hsGIabIeG$Ylz1ɕn00QoGjE@Ch(Wb0; Pl?ۺ'޶GwsV‹f(㕤B&\'KB~0 W T`!z-=^$A#w9[ֽKxkwhiΩc7r]8) IcWcߌ} #Lj0 JF9Qs3y nV*` &'rVS ?H$օQݫ_\UTJ=T+IT[4k) 8/!]%pv\)abW mQy&t%1;nwL~uzAIGm0U #Y5pKŬFZzzF޶4 ux?'[_9:6.5 VO^xY/?ƙAkJnM(Rčp97VuXKlM!#ʺǭ7/]c(cshCF{)0VB̰֔A55_NY}\MĀA2zun`RN жIr/U#+dbk9e d+zz'qOgBp>Vt4^@jnf]mm9X;v3ɖ.>5u>i\ cRb藉|~q!DIBZKO%X/nٞ. 33V0=v endstream endobj 2071 0 obj << /Length 1771 /Filter /FlateDecode >> stream xY[s6~ϯ})%:vMv'Scv_ْ/26ll2_"su WNKw!Mb'IU}yE 9T֢65) 9:HKHyn7/NV?,|eIƇҞ,anàмeO) .x\|X>VEa ˡE"yN] mdFRUdbH[&.22,i3y1elR.N>ګZvd'͸vyy}OchկƏ 23-Ekr,8 7|Iɳ^;]?c~ӝ ?:78 \9$K"mG'FDuLgk[`;Պzi8ECؕ1.cYnsNf jYaGW{8*[]R)}V>=[dC&'Q(Oq`(C`ܱX^]bU䭝!4e"BinH$93NZ;1>0Bת9@l(*h XjrbI3E.v hpw`aN jcmeḬ-oTR۩cҩ?e1h'Y0?ҕ0D̡@,5ZUоS(#yl@VVqm@(1H j@s`cZ-ddyrؠ,&H|0pr(<\nThdJfÑox<>xыEs3 _Sfx*vȧ; VKuU ܒ7wÛMnҦp @R)vgvۥk~8 YO1=!Hϡ}لYN  uyxT׵;ߤgDVi V$'5WN%gJ6cs`r)BG/ėM+!=bOSqk梔r؄NJQ_J%&ʗ3k(#*.d`U-ϩA lĚDXٽe$iscgbdz?qK endstream endobj 2075 0 obj << /Length 980 /Filter /FlateDecode >> stream xXMS0+<\Lk!t3A Cˡ%;8S(]V и3qq)88  8n {[̍QtM˳M״0 5?_u= ^ [U lL@ft$}"#a"W>]2Ӷm0 l0$mJ&GWh:|%}Q5];=> M鉀6q9nn}D?"O40è_-R˼ uq,f&CBJTg;6pu]RrƠDirEIBGZHUML4ѕ˝utdv鍋3:+ܼ<-k|,6SDƁ,TMT9^J5ׅ!0Z?N tB'V)Uԫ,JGc~sRsI)ӆ5R{?RȴPG EY 5;ZZԎ76eۃɔ.N?TlJ.+R-io(MJaİn85N-vh{x^*VKhq]y( 5|ӗz7۱ZE_Ni2<}mAAa׎l%h#W>vؒ_$qCUߠOU o%PN"ْ. ōA_n<cTuj?L͑a~p endstream endobj 2085 0 obj << /Length 1758 /Filter /FlateDecode >> stream xڽX_s6 ϧIVWT{}hפuo/[ɖgY}JN\^E &wgogWTkgA"$LHajG8 0kR~Q$ 5EϗHw.?Yބ+%F5#aT>L/g>Sdy[n(*P3h"f MOeLyJuG%old{uGŕW+w1JKf;^9\#a|;IXnD>QY"y T4̮FےE`Ţ\lS.;ϱwჩMH#.QOкgt25aBȘi.ǜD'73#HLhpj_3KI;Tۃ>HlZ!%L3ǖ(LdO`}b o[;abT%M=W̎3AQiH*,9֮Ag薚}pqLٯYQGpI E6]vG5DҀwE@qq)Žu1;q`LpHcNKarFwM "^kך'(ͽ)p0g Ȁb9a l7x(-\X}O9c#8%Ky7*0W8up»ru8Q8.)R᫁;P$'3U¬h/w>ܘWwlɱXR&AuoPXw&#ap\| ޱC|$.cFrcS -Lj2d˝ws**.OCi$4;Y~ͻZoۦ{=g\xx?7C endstream endobj 2079 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 340.999 327.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2089 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjP endstream endobj 2078 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Thxy.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2090 0 R /BBox [0 0 341 328] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2091 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 2080 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/xyf.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2093 0 R /BBox [0 0 387 387] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2094 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 xZo~ ԳUWZ;M7A}Tt$urޙ]h=\iprڙ -77qZD?jD![m >o#uBu߾ݷ8N;ho?`w$"=9(IoCy+|kE, + ;)Ymy"׵tx}bEA`%HO)*\MzUjҫ[ ZcBrxdLU;N;jW+^dp): :$^#*t%)_!In6nrein@١j6C>`eh]KOO RZIH?Vũq2>K0%0t<:e:3k!tv5lwYpS{=[ֱ-O7y>OU~.USLM&Jrg*A Kks->%ńz`'*|T;C]p#}K&Dx"h^hɵcn:U*,3Q%f=)'.s5ZtT8ӱy1i, m))ugɊ6kvYgfg4Tl欲;x+I6>T& 0;G+p Ҕx&S Z0x`ҭ\WQNC #YգE+CZnV׬7Q$ӑC.o'>jd+GRo#}8Fk@nVWAgؽ5&6X8pL͆Yt A IjO Prq <oj#NIsm!7zVooFFsJ=s\eEEzVW/Kv~Tq,joM@r2(\}.g4exdj>׀\ L wpQH-ةMإ KcRhU15gH+_`Ekf8ui{M^Qmo2?,ghIJ;bXL~SPk֮p L*-%`=ڤN3f%ڐznR^s1 zyas,s+1weIj&^T j*IE`o7ÄW7 7 o Í81 ?MT.g>M8)-nM:z*tSRDmp\R&δ3w$`]rA0RVsb(C'ffܘ!&}Fe=NA7ON~V!2/zYjZ)rf%:+ϝ97"^e>EuY/z7=jm,87QAv*>E޽޹sOw+ʠBԩ?H$XZ$겢S)˓y' OO|:] e6ɸr@Hm88Co,Eח^r)18c𔑭v aO ]{}IzɇϹst&U1詿QsFn[_5}y.xVn}2M &OVzv ھŒyP- S:$6|pz)`҂qUV5U؞&/"^s* endstream endobj 2109 0 obj << /Length 1927 /Filter /FlateDecode >> stream xYYoF~ Dz.*Q i-%$""mK^YJEٙofgt39sLNH0e3;o]7ø/GEA j//1y.G#/ =QD_Kg@KGKub4[yȏFƮG}dy |)v ;D$B[T8i%&VSAX 1o,E?K6ҘAIePLH#SUsNG[iAal,yodk`сO~O-}?]i:w^~0aG("R9DE"@$x:MzL76.ʣHl' A.GQ-*VB裺HҌ9"SAe,@ 19."dVׇ M<kVBQCX?1d qQC¥5-܌TP^C^SИ@B"3Z%}2CyY9}lP ]S)n+8kzVGdPSEViQudi}Zy*,R{/A$o s6FP%{7z GWh?0scr4ԩZ½sfoF j y<>;##G.@]W72!Kj|OШc5G| L%UwmuΛ"5n{3?A(jћ"Pj OkbߕSJxHxYnS#ih,«*ؤQkH\% #O7zf㼐3zbK>(KׇV"ȠUJ[m $6o[D =Ȕ;_V0Ti*μ]O, W0Pk&da(/>r'&hzA{ ]i9q 7),W^R#JՇAyudL^鞆+$F< ?Ӑ4t0qΦ/D!m%~R 5Cn=0rS!,Ørgߏ)|P`wFDv2uG }n7bx߸7ʾo@~AFwe9 &a_!}bQ#4[tm6q,wlA)cϴ B$dAQ<$7UZ,ENFE A߂(\]Zח1\'Sˏ[mmGKmfS9w77!W ;;r{Q9z endstream endobj 2104 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 499.999 299.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2113 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjP endstream endobj 2103 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/emptymesh-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2114 0 R /BBox [0 0 500 300] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2115 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 2106 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 499.999 299.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2116 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjP endstream endobj 2105 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/emptymesh-2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2117 0 R /BBox [0 0 500 300] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2118 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 2127 0 obj << /Length 1746 /Filter /FlateDecode >> stream xYY6~_an,.\n" K-Blɱ${A{"uuM9wfyqjpK0\!hg4شcLvFۮ@ ,[oe"/zG^ pt`V]a V5x"c.:.r%S7'kK%%%V$9Ma!OC|0$VrŐ\6Ěӄ-CiyESE{ĸAm\/N@ 6V^ q\$%7ȧfcGB~vXd(C.Dqyɼ=0sҏ[yj(zܬWuӂk 榫f I3#0+F !O*>{ϽUd\hI8#Ql;'?,U}g0Kf,&)"]v}cUIcGt8{yb-p-'K%nCE\qsFmdcw't??'D!^H&,Ap0-DzM ~{Sxg9%T8v< ‰A4/CkMyOJw> fWچ-/sٳ\ d ֦dOCdoWm6ϫȺ cӲ.W^g?Fx jx|ҘRo7(UF V[9݉!eF^Fe)pxW9b.֢ `^TW_ڱq?oF5 0 +]i2>̋풰/՟/'rV:a$ qjQo`}rl}e;2`yJkLjG̏ʜoqO@fFB}أ %D}0uD1g ܜ1LDe {'XV  ?GaL5DdŭzLpQؼ`,,:5:IQx Ph@/TEuY7,B='^&z>Q5/ s!!_"[L*/Q G> stream x+2T0B˥kjP! endstream endobj 2121 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/lshape.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2134 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2135 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 2124 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 343.999 343.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2136 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjP( endstream endobj 2123 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/movemesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2137 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2138 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 2142 0 obj << /Length 1944 /Filter /FlateDecode >> stream xYKs6WpڋX0^| 2v$I:@KD"Rv߻ Krtr3Bbwoq0˦)/O3˓'g$pAu38>u| ggwz^Ǭ'8aHzSu{L^7z6JjJ á+@'vNưﱋdԎ<~'O=L:yc_\$WD|$oza?^cDc9炒ps|uz6=7s$O2,7ZIEa4F]t`v:|y23Us&'ʔr^<r`1BecS \n#L?,1#o=WEj(]~L=P7qV e>eJ֒(!nj7(tĭ|Y,@q~9EyxM]8_Gͬ5Z ,@o{* F0պȗH6t,a8\Ec<+;ci.fx  ֍VVXJ}ˈ M{}hcKQ2s}zƫ>iCQXscZIS:ubji.NկJuKI0 }pNe+#> kb(8)(m鶒@#j wF vv}Ap,՟;N~C .d"5dԵ'E#:m#J{ OH8B$$\E ?XϢ,կ; wlo'(5|ugcJH F^BZ}ğr[{',*o򙰸*x\BV,{ Nak|:omgqv4rj&[j+q(~S2pPr Z(7 Ǫ2gq{S6eW N 5MLW3cnGudzs`D8w9$օ[tߍQ_{)j]Tw}2 6/ BQ`wnl'l4FN{ endstream endobj 2157 0 obj << /Length 2248 /Filter /FlateDecode >> stream xn8_aIX 10Yt21b˱ve+y`0U" >dXTwE݄N~ŇkF1H'/ d|$dj{..6>No]~^r?a]HJ}QPx~ gApOZRrmTlL(r ժ&ڂz.8K@YD,DHMnmB +7TR6H)j `':*D9><Г R^ ˆDãp/(TB\tHP\!Ղ|&d$DŽMlιUڮA ހK*3:0N]_7bmn49#B qiB)LmtC*4s@"IdE;ɕjǕ'^Ј=Wi b{QZyb \ O ]+VQq}#5 ӕU |8L*cV~=+J-N4,Ȳq2nBkjR%`9xiV4G7IXSϊ* 5DVP  ݢL(bWv BCNo-_6q\murn}xjAY3ځ\'%K!mֱf2mt%0O ax֍O⃁U&pFPQo|=Vᴏbwl4dAWé[Z7׾d>ʍ!Ix9Y]k%]iF}q))ȃ1W' ݱ2t7KB@҃'n"HE5PFb] R"p~G<:KVʵUՏX׍(hudalה _iy弛#0ǻg [GX}+<ٙ3̨YxRDОgndoQQPC/-{ /N.r%Sajn!>-ks'nqe8ɴSw`L@hBiQ)a>QXj#уz6p(X 9b'ĎpҤ2E[Cc~壡CH}7w~={mBc 4^&3JE'c(Ā7QϚ4!;ľP!ߕUJZn"' nr5dPzM_Zs;%S]6xQUYMch(d++@2_TWȰ(Ǜ(R&P5 >Q0>lf"3,ka@v\JGq," E]=djiT5"ȺK#3BkNη+3Ix{@n*ֵ0V0I cۓTѱ -F6oC]93F(y;Ӝ^$9ctP zHzdw=ҠG*$]t:$rƴQoߝq":#{WHEkE#:Nov[ItWv^/ TQegꌣxݬmJ[yWëoB> {ZSxj QJ=]|Upk7Gs$}"){}4{Hդࠌ /=h G*x&Y[hտgH(Qɴ*nϫŇM endstream endobj 2036 0 obj << /Type /ObjStm /N 100 /First 981 /Length 2377 /Filter /FlateDecode >> stream xZmo_o (!9|98q .ir^ E^jmɕd }zV$_&Xcv9 IQYE9[IY㭲! |S"@*F!بl< eY"/⌋tIQ`1hLe -Fh̡4$ㄢx㌼2zyd"I_XY2$/LHʑ ɁFhsIhY;](G5:RiMhNFɤ<$HkT6#{Ee|*b[a"X(`l=S qɉ*`ac Ŋɉ9(\^D^f%'PT$Y̦P @B!&rBIPxLQeQ̕|V2,! /H`/D˜ΫhOXE$|Gՙ(sӔFR]@z~;:SGǪuZ}оZam %>UݠS |{_wۯՙ ™Edc&u_1^{!Cz}=';Q1NJwj||NѰ3ގT&<={GQh 2[ /r]^}ؾtu;чﻝArоN۫ng.y݁oN>0AêQ/_~pm_[ ZgI3U{uzמ@Z힏ħf?M?.S6*ez/Ϯ/'/-his/~.nT|!d e0urV{] @qY 23iް{|Խd!6]CȊwyugҢx" % ޻nWk3,Ooπ` ^ xh5 pYN}hyvѽTu|. x/Z:I,ӂIg ytakQQ/ӄʐQ^D};GWo/3JQ;zF7.1NGԙz`u,_o_iFwn+v&6foYY uy7wF|">:?6A"[e\%5;# _βWbwT.Kb&(GM9uF(MJᲘg.j -8dŬ}8*ܝňޮ>r<*kn N" K;Kn%$hMWdwv`-lWq=l}c|+(_m{[ۜV؜y]1ceIV񠪎/6!֡jV9{OfCS*Y2V2!b&a<4zOKȜƈUs(kYH .%m9|%gFQ9y҅(.r9]d9V2l58FYI,os6QEF [Gw!ׂRO^cD#lvU?뻫9>RɁαU UPU.LBr`|N(k7wpD|j[c=l梠 .bH J]&FFHgl:!xxTKTd'^,lkmYagrcƣ'YGU\Zz*=6r'gY# g^@1ZaDNApK)nxTTcI"g ndqCrGPhf0>y24(l, wK.Aov=!OAZ M#Xٺ܇;8nX} NgJ\ǭW@?hzc2yn y>MERu )k>g)ەj="gF( YD8V_T+6{#ʶd glEv(0A9M_l76ѲTAl6[ÚzY\KK'5TO4D endstream endobj 2167 0 obj << /Length 1546 /Filter /FlateDecode >> stream xYo6_Gy")YkAh-6!Y22`Hwboafb::&GJ8tEԋPxƷ_@ EjMޏ q zᵝz{8&oov6<&$H`7#$By5K'nzC͍Lz4{EEQZJٸJسqGg#YUe%Ei_ꕴ*WJvv#}K̮6K,i4ҹFDP]-Ƶ غ=PvD"qqqy\d9 1`aJ+TU'nr7,/_L䶺$@c= 3 QBl"؍q"qz\${ 8|40ӕ@#!j2&/"( (b~Y(uw{H#?'io5_P^g+Aw6 ~[\ uk8lkMٿ¶Vl\k.[ Q/NMؐ{|Y7OCOu^7i{0CGqL đ_m4yRn sĽόۅL.ݺ۴L7![]ܗcsp/c377'-g UYW;,6VCL)0 yQBfjQ02l\ό6u1jIG &%m;G%mq͇ʼnD-y6 Xe:!?`H냤`~bf!tfcfFfNɻɭQ2"[%"׽/xG$H~4}8)6 endstream endobj 2147 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 782.998 445.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2171 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjP/ endstream endobj 2146 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/adaptmesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2172 0 R /BBox [0 0 783 446] /Resources << /ProcSet [ /PDF /ImageC /Text ] /ExtGState << /R7 2173 0 R >>/XObject << /R10 2174 0 R /R9 2175 0 R /R8 2176 0 R >>/Font << /R13 2177 0 R/R11 2178 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 2175 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 2176 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 2183 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 2188 0 obj << /Length 1846 /Filter /FlateDecode >> stream xڥX[6~_əB30@Kthĭcomg{#vNw.ߑihՋՓ׌҈1 6RĂJdU+o_ei+홠 nF]uEZ_1hM@$Y"q,"I & sILLy9뿮vάskMߒ~_@G~lEضjpe$/$Ld$#{)z037T#GLcbh;o39Rx`E&->OLJu0)̓I3ä)xؤMO6pI{p̮ cٴOnűk/])Q&G;f2"F!N2 )\DTzZBS .9YbfAJhkLW]vجͭ]gj9gRSBdqF(.q?mVxM{ЂjT8^"~')@q ?ƦT;_qh/rSqܡ8D:Ouk9m νi>"S)P%3pNNtn#2 (SrK>Ѩ9`7)ݹ/FuXxhO4Ĺdx$w7ƃÔؿ}Pkڛ:>'\g>H^D(zC_D3/d, 'HIei{%(SśΦ?.$pio r.{>.,u.rW?(MWy8h˄vA!JEGu r"c eۄrvE13*kL{3K%fJx>~93 Lòr:RpY@n%p1ʀ2"+Ӹor-yȟv?;rU\c1-s RϟJK#v<ɍǪY@*g`@''}qWHO\vkES+(炭GH,m=vI`>ygI0ur[&*g  2[K'#Uc @y4XX Ag^Z,XyUi][EDƊqaʇHYվweܘ³gƇk0~5 e֮(3 >"tmw!`!덼rlg#ta|-]PgT0&- )ٔf.Ne{iզpj-\[>b endstream endobj 2151 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 226.999 229.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2190 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjP6 endstream endobj 2150 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/L-shape2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2191 0 R /BBox [0 0 227 230] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2192 0 R >>/Font << /R10 2193 0 R/R8 2194 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 2199 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 2200 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 2153 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 340.999 327.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2201 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjP= endstream endobj 2152 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/lshapeSol.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2202 0 R /BBox [0 0 341 328] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2203 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 2206 0 obj << /Length 2640 /Filter /FlateDecode >> stream xڵZ[o~#X{F.@mR 9ߚ>Pe1D|?3;He'MXrv8ofVm_.~" `if4aR*3aIK\͕È&?/׿]x=KDxߐw2O|C4|ܿb.'[4y]WՈɉi!p3!uV6%\r))  36o.@@F1a)K,Ń<5y-6s !Fqq SݹLT5Ipa,Sfh e?dLVb X-%VaR1q;4 ћcդYS|d”DRLli&S1|e Y"٦jݻmoXG[Me´+|rSu bC;)jpC%MGU¹B3tmY-N=m]dm4GWP_-9).vPi  nfDs؎;Ml)YY:3'=+&sRke)\Teې`;(QCˠ ^@e@|*v TJh77f v~$nmL\({  ;/T@%3Ħ{Q(,6$znvH b6AQFOX'pvYok4$=Bm:;G2O~F59J= ;lA6lyVZgvl5ׂ_[2^bXR]iy`|9K{_9]x;ɧѷܣg#X>fV?Ht>L}+ #Is/CK9-?eO⩉,n| Z/pw&F> stream xXK6W9ɀ_b}$E E=hܵ=IwCʏx(z(j8$}DOYL.^$8g"ZEFD&ϘiXFWf)MŻ0?};^eJ' غU<1H5INup.2&ߴCW^8Q,Iuذhs)b*>;zKx 55BU7UE#X[~1&r& gLhI4-6s1|:0i0+% a+GS$ 7 hMoA)sm?ڦz)Z%1ؗXCvy{LM3CRm\]J'=Sc$a*ٔ- &TRIuޣBٺYNYi1pL+ bqP@24'$D̘,Wj'lB B`XPרQ!3i(iє3;a)zj8CyI" xýSܻw^V8k*2,7 wٔ)yAf&W,._-&&ePER+&^L3wu%q>(@ -6tz[&h7*mC%]: z2 mʢlO$w][ӏ^"uVeಲ5;iyWcq - JpT·*T$ 'EW\؟i`BwVW*cY>v z;-A ;Ѯ2pno(߈EDSx !CujiM5|I?>n endstream endobj 2212 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 409.999 409.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2225 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kjPD endstream endobj 2211 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/square-0.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2226 0 R /BBox [0 0 410 410] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2227 0 R >>>> /Length 227 /Filter /FlateDecode >> stream xSK s\K> stream x+2T0B˥kfP  endstream endobj 2213 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/square-1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2229 0 R /BBox [0 0 410 410] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2230 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 2216 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 409.999 409.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2231 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kfP endstream endobj 2215 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/square-2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2232 0 R /BBox [0 0 410 410] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2233 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 xXKoFWT>eRH[;in"@KB&>A{gw(1ia\RfvfwQُk=HfK/^iEz~+QMǃ 6nfWƾH|˫Wƚf01ֆ 57p̒\ @".>#G0GYjN.èKȥ1݀8IydsZʱֺ+`C %ʠCL|><߱$ L2oe8I|dXuw If k7OOǒqz\8Iu(De$$sO=)})#&?NRl Q ڦgOӋ (Y~8ќH6P$іEErW$ M7%|YNʾ_X_+a?oSnmQ3Զ=1UACNQ'10q%oDzzŦZg$ud=[W6r̀sdSN]ku^dSw<Фpihח/`` aڇ}J|7_^0haBғ͎vjV$0.zi$s!t%\zgDFTZڟ}=c?g_0_3pI\|v0Rb}2~-hscJ6=9fE?:u~ԍJcYЎe,uw 'e`t$$%\((5LDI0 Ho࿈5)n rѭ31@@ds,1θco*[ ZCh{w#uCs akjyH@4A˼@9nQ ݿQrbUd9l}k8}l-e@q @ V, endstream endobj 2235 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 343.999 343.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2244 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kfP endstream endobj 2234 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/trunc0.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2245 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2246 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 2237 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 343.999 343.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2247 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kfP" endstream endobj 2236 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/trunc6.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2248 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2249 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 xZs6ܓibE+ɖ܌;$ii?t.M&0 sLJ`khac:-.ʼn}omH=o؝6ط׿ǫCgwmW)NT1#pM +.pvɈ##v;cj9D ʊt,J?GiO@ 8/I TT?VnE0s(#nd$MMf ``|JO|. 8=_ێ}d@֓ q.pi''M2!K GAC#.oT$nAu@R$M .+' S,}\&[j&O-Ĩτ RWL]N~);B]))`$[0AeXhpY`Qo;'\;VKVت)SPDwVԹCg RgV20WhK]{TǛq4ȋabe}q7(gzldo ;^T)wUι&9Nt^f & jjUg{pD0ADApTI3FLi=pZ 9ڐL֒i=G`TO$XF썴J RjwX#od!" Q"d/m"db+ii|:eHt םbX~TG`)yq}/|N[޻wn.pυݿ{.8ťw{^GО,0x8zݓ^Iv;QJdSInprt lIo/'`8|OkHNN=q帯}릙^&A?*o̻ ֞5ٷ|zh>A>&?c$}H^5 LAX㜬>(X9k̑ M1qq/<^G)B7ѼGn\yot#eL ܍e> stream x+2T0B˥kfP) endstream endobj 2252 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/nosplitmesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2267 0 R /BBox [0 0 387 387] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2268 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 2255 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 386.999 386.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2269 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kfP0 endstream endobj 2254 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/splitmesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2270 0 R /BBox [0 0 387 387] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2271 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 2286 0 obj << /Length 1495 /Filter /FlateDecode >> stream xZKs6WprjAI:Suus}dZ挬%Q2ŋ4I=u5@`LJHk7:8(d8;"wun 2t(CF]\J&C-[]wmR2l`#C#NBK(Ga )-Ǹy0)l!Ψ➧R \hܽ\$1aXmȐ v!DsS1_3 g-L|'RGSE98ńJyēLNV_DzN6<2߰M.dVMTVDu*!x4d%bg`^_ϧpW>5 +΅k'-;;*&9"~ EhS$"AeC]7HP4HC2"xs/a ڣ2C"x3^9bU]ӌYmsO 9vg[ $&/& Uq>2e hB(jAm A95;밒 4ٛyc (/؊d*B]TCA1tCKbOd, w:-Qb} Vpoo61b3!3zh, "TC<ѹx eScnq~hZ UH.u~zf® lD`*:ǓhVǑUʞ7P <lje|5RH]6WS+m2+e-e]a61a;u"L.мHٍY<٫v"`EjIW>%zާ|"פTʆ ngwMy '_ф }P78MB9m;(?)%ZJJfa |I,do\^=@ /EOry[?jKܼr5m?Lz5.`XZKkZcKge2ץ^JEM°rV$Dgb Az9]DKg9ffL/U=-+:P,Uw&g/6RKR4S='A||xU{^^3z!ߞ{9]0s%iwQD9B/(-LfULW4gi4Zӱy-4Ӎ,Kb*M J ȟw MjQ%Rݻ"tK[ϼ@8~Vsl̀ uɰy={[M_xwut({s_ŧJ[}2d'%c\AR}Z<,r@8|5O˚G |f=/@`;5q4\TA]6ܴgnֱ.icbnN~͑ endstream endobj 2275 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 237.999 195.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2292 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kfP7 endstream endobj 2274 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/TouchSide.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2293 0 R /BBox [0 0 238 196] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2294 0 R >>/Font << /R10 2295 0 R/R8 2296 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 2301 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 2302 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 2277 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 245.999 182] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2303 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kfP> endstream endobj 2276 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/NACA0012.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2304 0 R /BBox [0 0 246 182] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2305 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 xZmo_o 8._۲t/vQ(VkKgU"C0]Βg3át WLjKfZ7iDDp*H&DaᝉLZKa҅HT`DEPeiҀA"gQ@kLD3+5,`.Nj%|14oL+>%(jT JDLg-,HǴ3i AEl13l1i JyfXuP 6;zo J+P6ȄY!h^Ld& B"Q@DЫ9Z$Vۄ0kØ@zP!zAfF` Ay v$4>ҠhP3014J)ȜOAp.jXź:dx̓:1 zY,y;ǼM9֡ G '1„}Є@}i8|DC z `D9|Ye4LˊFC4I0QEO @} ,k Iئ1&|m)o[忟rVv2q{lc>=܆v;}c/l)Cia1!~Y # zҎǫrq|<}c{~ƺI1O\6{`4lj:"v,ν'!~mxCT<{?Mf3?ݍ{_t?On0_R;Vt/ >gr{ܛȒeG.?jea7AL8ZYo ke=SY*N`xWދ/EZ2-|~ܽ 7 ;Ex"Lj_.{׫83ŜGUĝ݄lI zO惻#D}i+{W,Wf? aT3,"/ثD5.ZuD͢vF;Ed]oB7KܝCN!8`S '5̘1 %_bs23*f[M{ziWIښq&FGTd⢈DL0q._ -=Tɸu@O +l0G|~e'r?TZ:.`5H8))i< eemys|^![rI)R{5QqW=UQ1TdC[,rpQz9Bs'G:N:RPA*1}Dv\=8fΪ;]);̿*_JBXN`/A7y~ru{{U*M|KtjutǪ趋:i=0Xu3]"*1XL{_)H@> stream xYo6~_!^LGRkda[=`@Vt#OeDZvȃ(x;u$~sBD*ňކ?Z6sw~ZZ Q6< %SP E OnQ&4%:Oy,֫l(&luεRi}L jEyv{YLW-fhfWmѽD\ofp,Ʌݍ+ql nWa.qR iҝwJ aOHD_jr<`嶗)SFnT\U.b슶kQ'=>t 7<R\gm閑6PkX@_N2H'/ FH'8N'/_0TN$ ހ^ I:}:U=1000N"u!:$zIRU&grxrR*8Shaݭ'Q{qxJW~bZ̲cFg,V[q ^B<lo$NOtl}2Xs/ڃnTԠBS,d`ɡ1|8&YuΓ^#1h.TĴR\C6b+@*).iVor]Lrazi7*6jPu XWA(Ӭ7{iz==J[UFz{:HO{= =V7† pơ&AO-6c8+f0$tʵQzQL?o4jƒ^ڀ'U@X[vl|bfƻ6^Fmi`V:o{yt+v7n-nZ4o$}|<(󼓔;ٱzsmK( WiP =H%|)Rv6qS3XF#?Nm endstream endobj 2281 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 245.999 182] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2321 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kfPE endstream endobj 2280 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Cardioid.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2322 0 R /BBox [0 0 246 182] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2323 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 2283 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 245.999 182] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2324 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kfPL endstream endobj 2282 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Cassini.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2325 0 R /BBox [0 0 246 182] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2326 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 2337 0 obj << /Length 1483 /Filter /FlateDecode >> stream xZKs6Wp|*@֣HN;ij.D˜(U:i'RLakZdBv &gF<ƈ5"B5[WMҺ(aG@.xڻ z-de N?.?ާi˅?) lt  rQ'k4mDxLfzмd::)ƯO2fKvFd>$zlu}e=gSn 뺩nû4X^ُubuY (nմITbM:Z-XdUexf/oyxxث9\D7J9FHtZJX\B,l:HfS0şTGXL%la'܇[$uqzbw+R,;P;Ƨ;%Gzj@I9"njt)9Esu얜鞇|-t͖T'1 o`@mggE\q54E ` 0h )  Wtm81VhnQ2nws㞣t ĴF5´~z^T()  Brb-QAHCego<#d1"_9UdncR'6AȪ{k|+]´XLRAL{T:%?:n|b)"VͿ;U6*:1=g^ R|)C~׌eJԹvvIn4B endstream endobj 2312 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 202 116] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2341 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knP endstream endobj 2311 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Bezier.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2342 0 R /BBox [0 0 202 116] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2343 0 R >>/Font << /R10 2344 0 R/R8 2345 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 2350 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 2314 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 203.999 64] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2352 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knP endstream endobj 2313 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Engine.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2353 0 R /BBox [0 0 204 64] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2354 0 R >>/Font << /R10 2355 0 R/R8 2356 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 2361 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 2373 0 obj << /Length 1505 /Filter /FlateDecode >> stream xZ[o6~d/!; ~hV] =lٵ$A>^eɱ-)b sxA4@uÈs >2 !"L۽nN7zv?n;~T¢6{V eX1 #R-(L(4͐sWzl~p:AA"AB` #Bdz՞9QPmD,$ݴ}d3; W@¶wlφi5d쇧:TF fLe~ET"VφԑT;?ލ"lY}a`^!B+:I#w@z Uձe7%PEEs@~hH~Ugf %gu8e%~y5R*DԄE5ٳ鬼'Ħz옳H0fݚ{O&;}盛$S'a=PF9\}!sL /Lf4Ț$69z:a3 `z}|aC[Oi IAXjs\bDX5zvS"˚2)w q7}uHq8aڼkFzGrmH k .JC _]uԕ&m'SQPM)9^a!B'$Vx *~P8BQaXuRŌǩ.92I;$Tl1#$UP-i"!Dk6uʈv\mvEnHe'ң@* pK;Eܾw΂d>vN}:aϞF ml$ʰi\9zQX? ;qU lin;=;M)+x湜*3:*?&NbʨEL%,,WLe?Sxέޚ@fY'28~.W?g=D;+55K/܏;J()҂Wk2 {y@/3Wi\mL~lot߬F%H>kU7h endstream endobj 2332 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 261.999 202] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2376 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knP# endstream endobj 2331 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/U-shape.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2377 0 R /BBox [0 0 262 202] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2378 0 R >>/Font << /R10 2379 0 R/R8 2380 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 2385 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 2386 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 125 >> stream xcd`ab`ddds,L~H3f1g;SG98300000vDkɰ&ϴߎ|pfk# endstream endobj 2334 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 182 168] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2387 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knP* endstream endobj 2333 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/V-shape.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2388 0 R /BBox [0 0 182 168] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2389 0 R >>/Font << /R10 2390 0 R/R8 2391 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 2396 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 2402 0 obj << /Length 1816 /Filter /FlateDecode >> stream xYo6_!IbF?Rkvn߲<6c T-GnQxߑG9KI>qttrm9sy.ubDbeBd4I.Sj3eٮІY@M{ů:`hH9z^=b`y:[TxE{84`ф 8,`Rd8tĬ&l[a;N.R&*;:0'yQN׵<[1)ަbg 8?#4:digbH5z?QY`D?Nf3ZLO}X͊2:koQMQvTf1PN^8.^':g`n K#kzmG!: PgVB쵄vM>=˜ wM <f<""E `qǵ+ZJ挼&Bii*E(v,ꨄhnS<== -1xYxɲ%I7F3ؠ2!tsz:{nr @i ŝݒe1LɼSO(gw}C,RwXqɌq뉬ylio{Z6#>\hz2?x0g=w{o(§nRnN砒t=D"" Wzj秛kl//.AiOvdG3~Hgu-aƧ""aA{"uxv3s18f] wܥ@_?ruꔮL}j՗3oȿ6aEV\.\٥8ή٥G:/o0?,RM G&>y|[3CřU]Y5||bbm<-<p9H_@35#ޡ&ދ&''D 0_pU5 >'SPSУ_82Sz7p[|vEm/q[=<͆ endstream endobj 2368 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 135 167] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2406 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knP1 endstream endobj 2367 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/SmileFace.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2407 0 R /BBox [0 0 135 167] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2408 0 R >>/Font << /R10 2409 0 R/R8 2410 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 2415 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 2416 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 131 >> stream xcd`ab`ddds,L~H3fqg;SG9100010vDۈɰU?Q?]_=v}d8ftd`r' endstream endobj 2370 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 240.999 90] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2417 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knP8 endstream endobj 2369 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/ThreePoint.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2418 0 R /BBox [0 0 241 90] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2419 0 R >>/Font << /R10 2420 0 R/R8 2421 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 2427 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 125 >> stream xcd`ab`ddds,L~H3f1g;SG98300000vDkɰ&ϴߎ|pfk# endstream endobj 2308 0 obj << /Type /ObjStm /N 100 /First 992 /Length 2387 /Filter /FlateDecode >> stream xZmSH_16J*^b pI6#@w`SݯߧG6X6f+Jx~鑤q&L z P ja w2eZBXIɌTP BA0G)i Y .=u3ᡖs(.C@)ZI-S0aUha=Ғ /n.cIQ(MF54J_@ephJEcʈ(rq&0᳜i.9t+& bQq3e4C01^14r&Zk?Pt8 :\@ 380,W0K5!['A^=%58,"ڿ4Ē X5!ڶJ& ~\a PD`pV"1]'kNt S32Z+әz,ldwYR8{հ{uݻ7bWy?k Q?;:5̻7OfŠ(nzyBp4޹SlɍS~1&+x .U*<~y{^_V CyQwmuOϟx2ؾ^zxeTPZq&m%GDKUQĥp鴣E;T>3|aSB(//3,#Zxgy}ld.I('%c=!QR1818rP<*ט1/GݻM?:{w^,|& r .PVxm׫l q[@gᎇѴrmKMz\rn9ZkjEA z[[-[G[qYg8P)IDl!g̓- ȒA#G}QNt}x?ݽ$ J2Ռc{{o]I2X7c`Vi+s,~FUͱC Klrjn_N99ݘZ2-XɭJ4 ZUQ)S/rIhs)p^! qM,ár.'\BDpˬ4b]Bw3izK}_\EizLb]-\.RgRIbu_v{ _N+8ö ωڥXEek'ըg/ITDV-V^-!a'y) -&*'AQMaaZgs@jm9j筳ƜSU>cB?a x`or%KFij6Zu{+~o6FO["G8==Bڿ(gB*u90 }V9t<Ϸ_'~jvel-IP(87%i.+F܊,e y{Hd>Lل?-7. endstream endobj 2432 0 obj << /Length 2967 /Filter /FlateDecode >> stream xr8PylvڗvҙdzW!%bڢry%RDQәbX޾B4]h哿^<9}(1Fxgx$p{"ѬGM|oO^yo}uRQ”(c w=hq>(ap$޾tLy.H*\aK־e޾e%k_.b̟Cx~YbLpnӣfG o:+3>I6gs?~joOJ{)c.iErweS(.& r;/J6* s~1GQ 1Q-\-a6_;uMlJc:\IqB{IgY6 ymdeoJ%K@LHV]*-$!̿-u6_صm˪d,Ȋ,/3]^J`s?wRN苟b9aڬ܃KG>Υ^5g7QS:_͜Fq#vQ9i`(da.Q_G)[(A|_mu0U< p/gF^"f~"k G/r3De+/^H,R(Q8G׭Tc'XB&Z_&y9[ ˅!r=. FݢC߹aj=B zʋ8BJc-98||F((% }p&0Hu%*ڮQVLK'U1}t`H3Édyd- eVFFu.c/xB5l4KC;P(4FK@y"} _A9,8Yf .LÞ,߼EB0cC44)”"%=DX(j۞xe]i&{nMT:} `:R6HHQ 60) ;+ @Pj BJ^ާJ8Ƃ3FEX=H5Q Z racZk տ0Fq8zHen%\;NC0 tf+ .mk:ft|1! y-"! &4X?_Z 1z V3E#n! !P%kwv Y{ $b{Z;Q.q: hlvz5]`|(R|ѫ5vǠ44];:"o`4,zpSç,l;f@̿5şY#v́0'bξ!ܵf^' (|VX8G 늎Wq#ke|K[X|πɽw"1v #+ SG0G,6xfҸ?Hf SQ-sCfnP?,Ug#hA@32کVwC|;0u{DwjA%~Ko[r: 6|cw 8u,JfJq&8ZH+oMrWFD#[0"vȾ/IJgGg&k /N)1>>uW_GJu#ڗu^}! c߁ހ>m~k5އɵ ?AH endstream endobj 2450 0 obj << /Length 3383 /Filter /FlateDecode >> stream xZY6~#ւGRqo:[C1 IH 3#;Ieh4tqH/|wXH)JkzE^Blq^H]r/y*E@|bUXq3/<(drHIyxCaDŽRBφػ]Ww@/ɻTa;Ku(RZ"YW}ŭo@\[uaM;hOjWRɾsk_B2qbZJ-)5H#m:P@ibWoݪ'qj.O0.aѻ6nV5#KtXOi<@(+8tLe^V Iڭvfs]f3Mc95fTLKIzEY`?FdڳNtȨ")̃D.+# 3&4ҁ뫟//  -5lr "Rhٌ\j`o}YY)MJh<+t_ aakP `uOcF>~F>51R*6´ AOc.)d D!*L*w2EsYDR*&k\! -h, XW Wf9̅Ovj6،j'›(K'>q!:0It~uavO!p 5:/AxG :!4Sm)hBj4tI3#(5q;V=۰1VJLyyl*|mK| '@#|ňAxcsp5‘;} EI\ڎPZQӳju= x~{>#?:f6{X TŊxÌ\`Tvtu ЦiH{Xϵ*d`$Zbn[BݺvUUDйT*Dކ,1"Azv+fV$wԟ䟢H$"ip*yAXx&UTW>ܒ)g?eDC![i96(Q #ۓc 0V$25aWB,>1dAyUE+ a? D#g9`>p KvVDg+{7ps82mo0H@Qd>F؅:`=Z;0Eou}/7~7 ԤsHZȘQ V~CE!еv= GOf}`$i$gޜ)'g긃Ctd[dxaJ.XګfzLFW Q^I<;b'hp5`9 Fj 8t]wjO$rN4PO(9 q'JUޝC$hchK֐>gj;8 5bޗo `֔92;}~CZj߮cR%$C @t-2!!o}[@e4c =+@NJ@urD Cu ow2|eI?I:+40[ x¸(0HF?#s͔1YKŊR!cJʅ x wAjS\ ޠc9rئq 7z?0q isJk&Bc<+#;lRu`gl\ؑcbM!',9M:S08 @][2GtB$]4}ظOG͜H%\IS;ްg穽<݆+#[ݫg`xT%Pq~{s9b/ژm&2n'7ѷraûƇ/MZwS{ D McJ!Exe1ʳl4,tVL#+0`LK 3-5x.Vǽe[`#y\Wk9}V!2ʄgj,,0wNU͚<_t('\ܮZ`toE.lPwa@2ANOFtپec Ŷgd|'|c=!imQ=*:^㐁44DT/]neogmoƛb7Q3\i+E,0MiQiztbX2?F%wa#cC<|P@R3G{/nQyʎg:U9D~)?㬇3 YT")9 Y:'Qk~}"34>(?TT6FG˩\=19g̳CmBc2'l\\ZY#fCբi)u!}<Cˏ56+ CWuPJM&?0o@M&Usw1KZ0w1g`>!sS~9혪6/Еu ]PWҾ /+gҤxRF BbTS"j*> stream xZKH+{i9רz1ai:.c[F_YzƜ\Jeˬ,=0I)(R,Q$Kr5{DBbHb<|Uxqp9M/~z7`(2JaWT,EilŅJ6,:_f}<_@ /7E f:ȫ*4eYU>aܯ)It TPqQʋ=lEaLĩ/k6Wv_ʛFlǷ:~.5,WK:QDdzDdIHH<Qtat(B2zL8hZ\[w4{lf\j@p7Xe/ X~{W!TSLWb2YfaR.2 H LCHdZTl=˿;9ѬˊS -Tb 5H0c \ Ia%7ޮU&(񔆽x2O#I5_$jZ& `P 6=νFKL JTliCޛ;.CMHHǽPw4d:ͻ0$4Jh#"7۸G2 ylc`Bcx1P{ZNeCŚ~E6SI%D%8),TMݵmkMJ0XDc,/T~Y@dr,z{ ?ՑHT"37 TBgm}|cWU-7E2lTU^]SoH&3e4)v곭9#!«"_zqb |6S\\d3kp M3Gac ,ʮyHކ"/9LiA=ZzѥDx'.* bdؙD4GY!כ65JkjKk#fmɻƥgX$ny/i}om|p*(p!ʪO}2^A@ԯƑ0@xTŇc3ameKKАI\ctO`SE(|ܠ8,5?49Ϸ2pL8#dIB:Dq[˞< QmK桥&9 W[nMmαHc0I^.'J!5#%pƆXejh\ :ر>= ˟p%m%?9īB.=б >~:^4"/arIz'$;XUm*) ZFe|pYv/sb?^:^][Ou{ȞSq,JDWx9*c"ţiu^=u[ݿ+KwE徘DcJ#)g!sz-s%nˊ"!MKCVn_,-4c@)PzSBd,/S|U9HJO>' p+77Ճ#37canTk vJ } KBrBxNj+,IL߮*N;lS2JZb'"șY믌JiDK#W^\x' 6rB;8쏧aӞavQ\Jo7j0ν z]Thߥace{;Bb0@4koPEt`$ n[ɛ2a`)B623h$ .s=#0   $D}7<Qc~nXʦ:hw(%aa'J_7™UXqpz>9(;m_ԿMRND];u$82=_wڽކ.o'?;e"!t=z]>~mFE}0h:DȬ|8;iRŦf&a?E| N:)JMU: endstream endobj 2464 0 obj << /Length 1825 /Filter /FlateDecode >> stream xZIoFW9Q4 IZiMb@i,HoRLY堖\8y|7o;=z=<:~C!(vvGswu:zw`~ywgu=:}xgvޞ?;?{[ʧ :DI"G[},Lw1vNpZgrZ^3| A &5^e(!r #${24bW2-EO)u4qHκ}ȤK}ǒ|Sk9*̼Jg]"eS,uT NyblE>e+=BJ$rZrDyA|E7)G<$J+hi3M.lSN&ج&yAwu>NebJtn^T03zP_|9E6Ks9 -g:c&z5օ9iC(tx>aH0 gYn|6FYQh1㱄[KS(kCˀd(5+@+ιzYrq34'\8+q;#(K ֳ*C^A24*,q˒kURV, ^! 8xRFSaNŠKAeB"jXe#@wavEI` y37#UXZHK1Jmk(Eq:Buxj&V]ʵۃLz`v=}y򨾮S{tǒlb ٣ug"ÝRjǮĦ(N~}:_?J$wqAf<(mdh m3'Ұq,irGuA+ ۚU`dzQu+}{==$yZWg3~p8( (xKpKW .TP$({qA_sar9QSAQ!LtϾ$kVL-{]};k q2v0d OpCW O]CUWSU+z {V6 +lrH4y Gv} ={k'lx endstream endobj 2469 0 obj << /Length 2445 /Filter /FlateDecode >> stream xZKs8WtYy#ă)5I&S5ćd<9Pd"$ /$ǻI @?.GՓ?9}I`D)ÐW#F2Vht]LBBr2/'3&翼}No޽w'U)1R= F+p8b25f" J(g $~~> 9})Xo<$*㟯9_̢ _HX.\?%R)[+7eW{In>@A:Ѐ3*8#a<MNsS#dف5 4$G3&qzz2 ǂ= nb t?̘17c>?&,[65lc+ږd폍F…-Dmyԅ+uv\Sߋ\i`hl|pB-09 GnI52ߦҚ2|dhcܤ]%ee:ō|Jk乮_P05pQLre_2 $n-rG{ei삒pzN")! VidU & QN~˽b}6J?ׇԗigiUY8&B9 aH"4DVuxeZm Piˣ|?M4 >A|dM|Y&L+plЧdn] j?|+((!wgnWZu@VjI$/"GLj57FkWfH BHb)GEQ+v*N" Wi2jn+ ()@?&92WA4w oS c;rK"CQW[WclnxWbyP/ s  0(9j6zJFhMqM]#]jQsYHlpnD,+NS_ZJ/j,(Q TMDN~'. Կ΃Ǿ3PpAE@(~ VIIQAIC2 (OerFGsSo,VPKql9iQ(5,>Q5hۧ=;8F$$$I$MCJ`|'`E zNJE %J"wLh:WG% [4S 0Ďa w8P%Hq (@G$QdGИep^Wx5S߮}~ABN1v}.{GmfROAC'Ry˂zl@!uY,&M aWڮ&3cזF$M8P;D@|@^`z-V>]R@ĉQ8TxUѵ.+M3) Pĸ LF({DO3I#%sNXS/?ro|/D{|^K1"^lxFp+^< U撶Ak`Xa9V*FU|Wx SN} S+N8՛d&9O0m-yDxt| (:A[Uvrc':3AEXKh-lan"+*k[Zj[7wnhquLX^ l^tIknr,Sܡ땟#ds!m׵H׵ &^c}ضG령naWeQeEj `&_0' 0],{=Η/  Ҵ gޑy$n(g-v]EU752һ4{ƂwЪ,6H%L(]ۘ%xmGMK qfYw|Y̌͝z`r;FlEAͬ s=;뽓t4;a \yR#"J&Fnz7 :i7h ,X0~heTX5tҤhPYI9za45SΩa?Ա"J%#X p&Q󿞩7:@jY#bߦ`Ks#qO'\ d;[Kx<ۯ{,o3J^ 4.$w.4I{֔;*Xr{}fPC(MR;h#0lv;/@feI1'eyR'e Ğc6[^P<68x ';dى i_7"KqAi:0CF;{"")*wc_?ґ endstream endobj 2479 0 obj << /Length 2458 /Filter /FlateDecode >> stream xYKs8Wbj˄"Anʇ쮓V#Ak%R!)?뷁,y2T. 4ޝG'>9b1!JbE]/q:7Qڧ"qKϟj!*/ƕ^^̿_ d8KQЄA91҉qҳsWz^ s-("Jm,]vf3Mh{hBC.d,I1ĉhv'$@ax%xqb&Ɍ%Um!,bŶ[l;$.f.ƃ(pK7h@pۘ_l(F<(sL ]XKVL2 ~'%l1jc;N pTvhz%BAؽÂ*J @!Dxu{PJo~0+ en <)l1ܛ0ZEZ6tHQ~E BFM_5r؋Q9."ڔ" _LHX!bTW}_wr`(@55}W]nF47ܮ󏠛8õ{GV27P}NqÍAeƣ>Ql4|!2v!$9yTζl_栩-AO=A Ԩ矋%j5]$QIgS#3сΪIB"Cy<7#2z># א!0M3_&":#p34 5€fh$Ut.bݬ߱i=IsR>d6-/94QF j~| qv1i@̣9We:V0 "P0T6,DWBtXLݹ {Q£62ܠpS}V*N<v쩘TWd~8}"I ~}S)@Kqmp4NL8ue0z均W xF+KSY3PVڮt^l =qyĽϑ(4tMs0{[ D2\9/֬; hNSIO%\ӦZAܳyX+|kYjA9,>LR&YH #rdx|]Gf} )gO6^mnb"4 -o`3eu1q ${T}&u_!ZI")3";FR+'(y'ШXI7'7[&kD,ƃBS+Ǔ%8QBGS]Bh"]eG1q~% :=MC U7fsf8Op _Δ$wr6$"T/Tnu8Y}@Mkk/<̢i[׶< $;޽Y!P&K̋`c$x}>B ݣO\a$$dC|n*wBUC0${Κ ]fzvۛzfLtB /6}<]\=Ɖ9oe$bɟ/g:u~Ľ8͛w~g endstream endobj 2486 0 obj << /Length 2002 /Filter /FlateDecode >> stream x]o6Kf! ?the@:ːbK$%w,9j$wt#E<0£_<r`<"<I:(jtpD0O _SFsF3zuqyoލr`UP`K'媣ot|AB00LkzM?Ȧd9{mGW DTa"ͩ%H)eJ49ָ4ۀ qRS1j t^[8<ȗp1cHn`.r4m@50Y\LlJ,"SV f/,^~-Җ$T&L=HKՀ#S%[N صnԉd u RUFV5댌HE6̓lvuNvO2Oυe0Xc'g (4YM1q σ6݆uV$nF;1@]|*~A` i?HR g%kQGƋIj*OIIeXrF&WԍM)fPiy?,[ۭo^0?߲e.u?Hv|rARHw4P+8.Y<bm2YI1#̻C(n(X_maqzf竷iK *q̉O +JvF՚?,# $DDCS/fFI'yRjU)1VYFG\/Lf]P/nk`pdU&Ǥ\Ƴ?dsEy CZ'E93FѴ$L ~ے ?p6%eA[|q}0J6id3.v I$.OI@K~0/x Q'*rVEݰQ$x&=sE& g&X#8ڀ c%*ɟ)4ŵS~;/T#Ta֐j;p:4 x OH?K$@, q[]Gc"/諓 ˜>{612=D+٣FRdemC=3Yc oCCk霽 mBPD%i\qǰ1)_fc9xsҰUuɂ)a4WIn USajk. QqVP/ soX(}Vpe~̳p'*<`n ͌fl :Y)Vj_w-թؐ@*q fF,׸}eAaG -3.BxhuU*1Nl2͈.xJ\DBy:yb&Pu?7 PH(I C wi+(Sm6eFVB1aJ*>Q y5O603/KPt.~xg)sײ(u[v!Gt <J /R7)eS(SNmtWI]KҌZYn૛~c#CrOȖ96ϮK+ PlXtQ0yjk;+FNՏu%f-a;'v-㢩#!ܦ`~SL?ں2 = L"!mJ:^ey SV.[;HX]( ,'(4tߘ)\$E.ơpEP@`Cq3t2-rG!bNDAX!dJmF) Z_P҈nWzWs+"OsqD]ݛN)R .A5 endstream endobj 2492 0 obj << /Length 2869 /Filter /FlateDecode >> stream xZKs6WL岜&@(8Q%z Ό-o7K=MT%@wtv>Kg8=z,WJNfFLnt5{p!Oai:'aV w:=y3_dB'F/Q˷'?y><9}((kד#70Ɍۜ kgZ e|\qIJ4֍ܺoxjmć1 |1לT47,|Y2(Bf*9*֗k7IsF,t=6)[Z 6Բ-j]nUaQ +Bx4k]doimy ɳ'/On&p-|4ܵEj *I~M;6YTȘ0-x=8ӆ:]y7~=ΊeD6lA'%c.X;ʓ%iT ?C MK}~:9M5UdN-qE93KU @Eiw@,9b9^l!e[n mo{jlkz,v^<a\%PlpY^7+ pzNZPҎm}iΗ{IǾ}߮k):'ohB 1 װPJ'?{Oն~Ml7Z%/Pk֭h>#%n H]MqSAZ2H:AQQY MɒPǨЄ 5FKX-5z| sw qpG.4, z{U.rpqԍF6ޏc\2ɋ i}'ćE% =48'8^;PYWٟ*<:Eβ\^\*.M،tFT)T. :4uT)U?Jc%"&2+@ ?$4& OO^V[, M x]u]nwT\5v*b 9P#jl˝YWoVQ%uʌ7ý !W{XǶL>r|0!x΀C|UZ,R`PD:,Gs> 6}XPIxo~rTmV\]~Cu$.]9it-PJG\; X;" /0bT8pd#GbgK%4TA"aL,sdSË%ݠU01]W8\;s/hty쳠rjڇ}Ul:c( Lߤ|Z&Z:RՎC2)$8tۓoŒ2(d\?/0j,ׁ1xﲆ3P6rD,0=Qu]4l &GJ8>AwP\ J܂NVC^yp^qyU](9*8P٭h1`i>#I)6F WIцds__d"4|(N%qj4>`gCzCSȧa) ,+0 ksö1]Gu[m>w ИA.Z~$O,0>J'O^L0b ]yszYiwQ~ Dqǥ*1|,RQhMP{ܩ6gK/``37H52m`}}/Ʀ YݕWtxP=B0?6%t VTY~! i!*f ʹ6, E3V[,uv5Ud5ڭfA`84f(O#"5v7dNbdLdȵzo`-Vo'F s5A;*)N*GN=`o*8*:Q9*86P|"NAڶBF+CF_AG`,yFWIM+D֖Wr ÌCگ55"Xr5t‘.QneC;(tZeXJkK5S ޗH +[ozkip-ab0͸eNwVY@e* أY>B᳃T܎,XYtjů`'Q 9;qq`G0\?rb0')jXHmyq5k95u[]üʚy)ېocAyM?]pϋ>xFԖ#`C8l NjfpXۯxm׬WїchpyJ>|JgH5ʔ#w˻S%*+fz>E3|Ȁ=0,CƊ.?f&!a`.`T')RG ʴlgQ2~-к~2[{[k`36(Jds9SƁy}PSrcE: sJEp"U_Q#&bPqu4o;D{?TԜQAJP84OƳ:Sy")_xWzph1r}}:[A3;䆮Aem/G?_M&Or<ЙְDդv|"w endstream endobj 2489 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/buillayermesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2495 0 R /BBox [0 0 921 472] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2496 0 R >>/Font << /R8 2497 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 2499 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1837 >> stream xUkP>Brθ]YȢVDgw)n ,r$p '!\$$(.-X]u/LuN|G?lgy>$$岊IJyb΄?f#/o$4@<?kc:ܴ'=nIIJٶmc5ŅE]5* CDY*)TWC)#CBd꒼Ezeiy*/㲂PH$>$D*ND;X"# xS]߻~wyrMS d v!D3ɑongrX)&⠝7:x6v#?z`d%]@E)5,'Yde6dEpBgS+E PIM@t O!&NxK5bS>O[甧P@C[JeQ]F]}p}/ Y^澘$ߨT! 7¼%[[{eliiDDPߥVwD%;4;1Q_J$9'%jiSYXˆ6(NFgȣs 7*}X⮲O{ I&_-Y՝c:{޿$`*nM# D4NS/2 Hi '/Q+ I5ٵd Z74$|:o}=%rgLX ƍFAچ C.HlAM}L]+F'(=a*g~̼TdK3;+/s'.p!vbTb:U)OU"XLutB#WG W/Dkd:VSt<&u#hnb.v> stream xے۶_Gib!zN&8wtuRR{@V7}s ɟ||"+뛉[:&U1^N^M _8+i?<NC__^_up&]B*z")y)|1*w5Y&$O @ ¥$XVZF\BYljb=SY…K|S@#:~6zn6aZus j&uG?q:!1^rU,`2/X-<6PgQ}6FT _I83pr@9:hG#m~I7vsKά@e/Y)ݥ[\9I.Ҧ 3F%"n>` q^}BB1Q1S볌ЍYOfEiR{nnrvO˒*bJz]>Zo(2$PN TLunz|܉.+_ SbJ n{%L/Y;ˌgeCd/:EߑCu'c#hov b'.ӅO?W}*zqD/ aqw_AՐx,sxUq<\2kh(Ew :?mQj,zUCk'@=T] 8Rac bBAlxFhd*<.vT\OA?6<~hY|Ռm*y27 OOLm_6/9 M/Cѣ`\odҌFHߔ(?9'ӷWI%;0lCMZnUjz9s;zshVU{zϜ; 7n Ol- &M?,G K&ە&+vl:ͩ)}Rm}0}~toH:PQ=́7~\pNN&1ٟVzn6O߃|M跻 )D0CfwVExKrGޡ0n 'ǰQC Xi(ENap>B䎴#=!PUiR-%xe=u|ş1+ #vp ?C)Yfft0W$;ats])p,k8O̜.:I\lF}bQn.\NH&ͽ ^2dv=G`Lp>۸*s}_e7j>iŶKX,)u2'reP&/X̌ty'k{Ji%E.'\{@5>ˡCvY|w^-$|x8\P#r$} Nצ%d 8nx//B<#]I1X鉴00H=!L \+A&ٙ TtȘؘ4*Y.UJ344!MMCW˘'+u:'uʣ,>ox*kxi{ض ;޴XV/Eb8./Y gRR,T,g]uXݫ[DBX0|"c ,pwt^euѻ^x& .XKs1!Ȋ="Y7*4S(Yk D F~5pUb>Ň-L/aY endstream endobj 2512 0 obj << /Length 2253 /Filter /FlateDecode >> stream xnF>_!H;Tc Ɓg1QG؋Z%b%R! iz 1[z7ﹽ?O>~G$&w=0 {ɬwݧL n&0׭1' 姟'W!g^_XNj_.㋫O'?4V?H}d$tCn+, \ =6^βt0\?j:.u> KQ_.pc_lS_Ө 4[wYn/ O̯ԜESD  di~Eoo #ICޏYk,_ N^BѲp5ğ3}4.$~erDxʐPT ` ЯE\ e`HB)B4Xkt$B h0B VW(ep*Fېy&ZzcР·.&B"XEZvr0EAJUdLҸU.%d}bڮpr4@ Z?ʣD 8-[>xEϓ,mE@q+&kٳLXf݊!e2"D2tڌ&DSوr<l0KjOBE+"=>RFָ (jLu0ൎMBـ{Vt6YHxXS UD{N0qCC8,ՠqNAdʤxLR%J|_t,lu_S^G<5WqрU >lRJΖVTmu!} ,jOe!c 3NB*kWGEvuUԂA-Mw64GEM[ۼG*ct ;[í[QCU|]m n0MHǂ^m{ | ͑ 77(B^e*n}қS92߬G׮7LNv)U[BkjmC\bķ٧h홨a0;ރ#_qIh_J$mIA._QkV;)]wm^`NZ3c?vrU5@,lUX|>AI jӈ36?l 덒{H$МjW}GFQ k,]+=TٵuM}1͎1^? UEP54U_nVjRoZ2``¬fIOKDw_zL-5Hϙ L'\uOm'Pq"FKגp!Έzɡ')NVl:&N(djw03(ǡs3<ҹEs6cF:U#*+TK_2o.tYFjdi7Uլ}5nk'S4K g&ƶl}wZfبZEX ]A|7{X\]sy9YN_:\r?mu*G.HI߶l7rt;KQ5$w[gFr8!]^,8sAVgU)%zjhӕ3KkWWr@VvG鈺g8R_c(9M?PI*2 }r@t§zш̺o1Υģ3:ˏU8H1F .J>$X\Y@y1 endstream endobj 2524 0 obj << /Length 1273 /Filter /FlateDecode >> stream xX[s6~Wx[j[KwfwtJ` 3 f0h3m$GGG߹蓡3uK"g ;q x0xr2%/dk2LyQ;%F'`?fK& D-CKK݇sb,*23\p0Ffy<:2>rF#@״E>|c8Peο!X0!3OgR!mM.a[ 3[Б kd8^g.^lm]ю/iTitՑ r86˼gp|h4[0  _h=}māBq]8ճ.ލQ=G %f~5,1n/I$.gC#IMZU{$R4OW3@#ϼb4rG Iq']tAկiv Rv~guz-ݞ ڝtYuazgTy59-Q$1]%0AN_$;C^e hsMb|-fD^ebF)cF} 33 f/ƨZ,hr̂&{4&QiE ^*^RU݀ 8T6)~BB"5 y!DډQ `,mҿ']+*eZQONN%&(3N,|לfS.0/{,3rRIiԢ Y0X,k];'(ܖ8~>H=.NM=ˋ).Sor6z endstream endobj 2519 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 599.999 599.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2528 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knPF endstream endobj 2518 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/cube.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2529 0 R /BBox [0 0 600 600] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2530 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 2521 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 602.999 508.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2531 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knPM endstream endobj 2520 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/cone.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2532 0 R /BBox [0 0 603 509] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2533 0 R >>>> /Length 185816 /Filter /FlateDecode >> stream x}I:ۼV+8D[,Ii灷o$@y7SF?&g3__xg?ǿ0itϾqӟ_?m )ۗgqB]U-v ǭ3,;յv ðgC~IJ -O?gA~e?aȦuᣇߡu ̼þ~wv?Kkd e?d8)|gPO@muW#3÷sndaMgCmDZ`:`.h_[0ɻ\/o֧ Fxn{oy؏ CI>>RϬ"~JaAV4q?KO)>xqvPOtoŭ?k=43 a]R:BcN(N%Ff6dIbeN6wi2__=j_Pvz9l=ZЙ6`)bdl[C3h/[q Zc3:ĔXoxRqL ÍoC2zMm 5 ~ۢ^y\φ6??Njؾq↮.wf2x SC9't#qۆTC}т`hfMa388dMnˬn %[9$;ۉ0qb@ &2Y8)JY=$uP {θe6~iF:?: 2_?jJ,lװ.pY ^u K-,02ļ.03U6ɾK$#8gtڛoU1,zr(PdFNXMZ\dЅX 8#z63L8nB,&kd2teҜ{}m0RAhVmM R Wh]3n0xb_prt6B d{)5\:UjЮ"֗dX=Sagk3 g)S>Uqҷ)qǹ$Z6V6ip-0}M4>uID]7x1JȪlN|hQC39Sak` f-𢎮Hv<[jWOOVcW2YRdkou/?_f8"p3EX$SDA鴍Sz],4=;^_ 1M(iYIV;cYM∙5qR.Nd+5[<;se^fNp㸳'8}ɑ EFq<9RPBwh`IaW}ǕyGO]A'cZv݌ Fz=M?ԓ)X'8lۯXgljO]"M/saQّ|0picX [U<|t(: N` h?1N(8ń?zװ%xD]'(ء8Ї:mE+?Gk`D’,rzKtmKNn{GW3}EM҂eʁu0)aټ46}lw[ݴ7G m|}0zVu 3ٍ? 4Jh]^8ǕrIh]uz9]]Wat[kho K~H]z4w)CrB=!>b)UW`G_y'x&J~ ِf#0vp'T+,Ϡxq `wӒ!6>Njf|u{5;-^GzgFUrxy<5 F0bv|aB2VVllV<Un[5=.4|NhU* ,e9܍ Z[',D m=h>>u>c4 SMcTX&tS{҃Z}*Ұ%q * G$~9JgNSgo>;u.ت=,d!;cJnCSʥLޑ-YqDW7K<_'KncB0pK,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 Yo t_K8ů-nW2܌zEj2 mRZeHY/dt%z)\[(پ +0f,%Q9$ N:IDZb^l?iK&;9 MYdԔ6n4,ByXN4 'iB,rP[Ջ01N#ĸp{ B_maL7,wiU6UFpZ,d'v]};{wm_3r᷼3 +γ DDYtO'0=ƥU0摏|Xj|J]nj=M9)Vfjy'Tݯf#'Y2x>Ly]CmF_ItV aCd) q43Ґ5TG,EV~4[^{wyښg>pO{"O'0.x݁?ޥByrBhbIsaX QRAY+[ -m'i&?n2l3AZ^i£lڍ/۴D}!,{',zS$Om΋u0dmq.FY#PaiY9u!PV<)!PCPvX;R$dW eAźP製<%py]"Sm>EKf4K` hJT#&12ʊǐ(hdR,AGY2cF˞ѣ_,A1+5mT¡W);u5>?/5z*55vIY,HOz"_&\V .+4oٳx(SN8Yh7s FuA]Ѫ-=k1pH"? `=мkבsm.$-`#o_"I!}p_ۆx?r<&\l`Bnfhh}\&6( 5ї%ڃĴ%k` 3n[n3vx 6?m.%gs~\,HZO,k&˔@<`A $3E@(Ytp&+C8EߖxPOy%AL!a;ҵدIQHB ׮߶ XWu22hiU#BlB DB5J͙e=;^ܿ=rcM5_vUez» vj11Rݺ,?ibU! EE -!$/+(ls tnYblM85k`?P- FLfxS{3ckC =LIcQJ!&33~(dn'vխ^-F05Pͺߓ(:HHFz*H:JoOx\~ /+A%ynN#!ˀ3Þ 8s?m@:-r'tᕧ$d2EE$0[UM|Lh)&Ȧ®d\'ds&kR[Yu:]5cGu'jVH-Z;h0CVs.3M_0EU7(ZFsO\o,-'pDIRB]lDޠ2mYWKXi%ϊѦ$Zl5< nAj5\7{t8g'ԻfaSJZ 5.OKEGrZ'\hwJ>ֻ_ ߄.N/_I; C)@jr0#%FiN Yjx]U'MiJ*es$=KAmTlбmNt sjPRUB" >q-|HMsWkc#'~px?TOh]xe([f*!Mq Шo(DpwxA!1ʢPiv~KeG`m&F-Y`FT0)щpHq2WTX+D¤UX㦗ŮPCՈ ]0 5'=ý`v1j(2;`sZSKӣ,jPk'yއcu1xٯܚ#Av%pMU$kK+%кEh30dC(*(hnN|r:҃X7"xnŢFƯsD J5"!BzpnHC[5:fkɭlC pA[dcjdt塞G2n)(tR*wɿK [-qػmOټ%n_'D}Єת u,F 2;IatN AZ"xۏ"-p]w]MD+-h?$a?ׅxزߴԅc|oM%-ỻC6"rc;؂#42![zI'X)@,#waM|0[|җb * ߼ 9r:/DNy#ٳSBVŃ94Fa؜Ѓ}S . JSuI=r"XW{9Zdӛ[RXR^%u[6=3>_0ưɯN@njҘN>YjL'3Ei{=g'Wt4{o]P4eƩ3GLeR?1F`N0DJ_X]#N=v1?3wȯr6@U?`p1f 3wm豍=hS6jsWY7g͈N }[66prI *гP: V QPmxU۳-cPJj*rc 6ᢛ\oONiB%l!C NHw] l),ߤfn8L7Dĩ:TYt58'V p$P+=;QzGE)4hti̋(x<,|pl-Ft![d@D{0@Gh#2U%JŘdA兓i=AI`z5;iʛ\ 3Qǻi*[_oufkB**w-" l!m/ JTFhYo}ʇbޒܴ01ie o\duRAma51;/l+KѼ)]UM֜1DlNTmOߢ2M ~W0}f|,C422d, x),-mBIBsD".Gz ֋{oճ= [RC9EG'Ժv ƾ&_jBt{= pLꂔ(OxR\Ɗ]*P\D¤y}ƦR`*ip`axʞ'`͗B`P= "P[,%Ќ(e#0 H4_wWZP*~p/A'NxZ%<,B;3`_#e-.F2lM.UChճղvպjyS=;^F*-aa*.FeI?*̔.-岛>QBv}ZquۓZfb kl#p'*(N2IQy8qlv:GM3Mnv y<pVK6MAr)5:LXH0B5BկԬh-ވDp$^ >SeW4FA$G$UcpČ1h=N6?츒ɾ}~f8q"%ÄB >t ʱ`6ې/17XUA-Rף1&]\r"u% jIl[pF5g.j)Bh1F|+Vt&P$r{`T$7 g^@s;iDt{9%(fD~+ S"Wh0Лc b Ŏ=Z`kP~ X8ZH?@(>Ҁc/[+of7%G`cO #+)`(1N+Z(o[{R"Pz0ܒ© {.qO(C=>o7~'l%gLݯjrL@IN`R yKuXRJzQ-Pg)V#cZt Lc1^݀j=va'{, 'S%~I:yc0-|݊ b@hE+j3* &!vdIoS [m%$-ql)q~%eVqk,07ubNdj#xS J5%uSU߱=&?/)p2t+ P{CmB j"hK\eGS'~^i0jzEjp]⃅Y2:h7'Ч9Ɔ#dR G롞ݶU;S"?8T4 ,c5|a!$PpuFv4E ZRzopkTN^=OWB<:_DC dLm45NNS2GC=f%O[ٳ)dI܈}'@:?_M[\,$smjM&19Τ1@VJ-XVu :ԛmBh$g1FiE-2DF7N Γsb)#QbHFa Hb27]ڧkKg'{9^/#SJ%چ2Od?#=.r?Z聲zQVj>E.\jƍt^sHC=$ND6M]RRk_^ڍfL`ԤR,դʚmqbFeӭV {)v,<- 4TzRYQfJ4cggÁ].7\>p>'h#cPrTB%G]]-:aЈUJ.]ICKM-{6f=; i_'ܾU gNqƅOC樂}܅:`$w~cQ>0=C)֯j6`(|Ϊ |0 1.t6Zԩ!AI>_ع`7[n TV o11=XFVBڹ &7S=-j@tjKdv5}liQDNo]ՍfJB8;Xe٩ZvEIe.[齉$4u:Ji\2^lR1jsmD~Ԫ?2,ӓI`'Wt#0;VR-%(w QCEj'ZB<"@ #[‰ ٰGq@ g)sj$@%Gc=e ŠBtEy/苃 +!кZ@ubqR/Q<㶏vg{B$Z8QNڀAdK$J^X=%rkH!tt ё'N xL 3~:ri qPp/J&vZ#H<xMGթISZm7WC,()Ū}}]ouhmPRrΡ8'ٴ3ô77Ѳ%Xn,jl$iaavLW!HSc&NЃ&ZYM lq0e{(7bһm"ZEɓJ(=B͓0v^M$Y"5G $.dei3NH+t_3LuI"kp*0݆&PK6Q#ăj25MH\c1>Q2کS4xPP%bVOh 3 Ň\[B{fk@X)qw`:Һ]RZ - 1T 24o^( <. Ieí)戌F.la )=lT@9D.՘9?#Db8}X@j$ט_G9Aݫd!.,Dg8NzVl&&g@t0-H/D5:@<6@0c2 ٷ5O6ΝYsT~۔OSUa}%\-nv}ED!FT%Ke|^9x{ 3Rl6Լ[lkѹpFH\ʗ-TamI\qE`YC2U'+AwF;+ϛ&BD-ah8 ̋5^jfP0UNXjDnݕ~ H6g.1 x*;͋,^G_ u!IB?5O; Z- u3NMɄ\9hu$-,]#d2$ǚ KzscdYeCEzHO#  pfSD8uV3QcAQL%I-GPKڲ!ht-D:DRC$ʑx6,+5כoYoh`yX%mBh_&~ Yo ?әjAxZBIc=K8/)ZI-bNM_^gpB3s$>ԧw=dHaE |@UWt{'*%f~}"=3ͦ.eze!oJb5% XBFi-z%|Bzt \nZjL~^@Y8j^הΰղeaUe3YHa X4'_֙b3_%3.+q`1Ĥ謲 1lzJWNT݅ #XӼW'1-@Ѧem~^K1~,4уGB3"&Ƥ$´!\, >sɞPa2|hح?<ѕ%KA"\æz0=-oc81>;kM.jڕwj=X7 p}|fKbJMw Nr;^#w>4F_9|X)F0\jW~ !tSa-6pRBذݞ~S(Ihf[_ojq[!Grj1.'8&ZT=FI G'x8\oN>@??{?SOIY[Ꟶ><#C=;SMO/{n1nS.kH - 'Ϡ/,Qrr^E UZgqZa*oȯX?i*-͠3o4A$˃UZʮ"ا*d*Eɸ+=qR9%MP:i¶, ֏hFdV̲:XPCf96@C> Mm[!~%EHbc( Z݇x1:,}朋~|gۖO\}vBot\~xV9]H ϩ,NIFQ puuźPw8c ؖ4s_-IbtM.朇Qp>__0*V.-Qs{'ӽn پf+ހUj5n{.g+f3ظԐ敞X§e[ A1 !q !;٩DOtB767|?*- rоg߿y>a@C;ᄶZVK?"xᛇ:ry1Sv3*}"oJ 9nhwLj8B2٪Mk(FhC|b^¼p TO3X87c`Bc=0TPD_`}uTv BBɞukpyψ|d=E\iMQB1fJ$ m4&ŀ;+[|7<+z D+z-7-;)(:'$ELI"27jWv $ygY["Ku$EubQ26P{pՂ&nTb~""~KxF i8Шv\ ˜MC.PƘP* n58X^iN@t"aɴ&?, i8d+H&^5 elC]zo]"^0źyHX~xjgØ}-̞Pf.J EɨDd˾'!Ʀto5oH*@q2o >ֲ55]z @!;+rGcx/Hv1{ҸnwY6<\)F2D+4Qf̳דRSɀ1g[L(`ƛS_ Iа90 4 _TdYɂ9E[(ng_쒷 jYF !J>~50x3%F*'so]y֐[$%~ hvs%p0o˓[H J֐uz约<.8 L\y #? sZL 5?5IMu*H 62(K45 KpRnd뎳~j:Y0F9E~|zcYꈘ5+=VtY0үdXrj[MbR9^E#B5O/>/YW{6.$"e);GI_" ζ~qWv̲e򑛵1f;V>J!( 49U!Բk*p@)PZWC"=}<vBBtU"&NtɩxfxYUMX ΢(N#g*@_(FC3{lTsut3QUSZcUމ4PDtEo-Iy+*byЈH{Fc ļ ?quDyLw&И%0y\BeRջJ4⊰kզ]"w|fgVL ϖۜXa:Z@A:]73 3ZWtRT! 5I-·~ڛ쀨4TČl8zQŒúTZp*KJ˖jޛ|yT0]M5sH}?E&03]"VJyRbꨔA蘢[A_j4z|vBd 1K\aq:%P?󬩾h2K<`h^KZWS >g!fNNIDŽve:yopB l𶻅Ut )8:XSKaPE'{M*ؕ_+0/BHζKQ"+HD',F'݈L'^KP<sh8iQE;7X[4llOօ1-LHmg}$Y*Ԙ܈ iE_JשCjU.vQs2kXۤ?q/ n(1TnLQS .*u#ozD(ᥣe岏c_TM(ƪiDwͨɅAcn[{g|UnI8.ď퓴+1՚cMCdvk>C.OW/N}"9(_MӠ6M-[M>J$,MTNlr3_j>A/ە =QH?ƩWWi:4+x)@91}^ӿP,+QQF݈X)-<~sC KOo[کUBp}5*8mZ|DZm5:cRWFBCVƺD;Dx }7Es~H# 'uIcRX Z m÷^OR ƨn[1vnsV#8Od<C@3M&2l;s_/TuMd`FMwHUA$jr HT]! -niȚ8VFXQ[A#Q瘚/Ȋ}ԅNNrr })i@aA+er]4[7 U>:~FwYW%CvVJ+Eʳ`)4ǭX<}0g% ÄQkُZC«#R`!8Eē`xRj*~F:~(X_K̮+<{"4%W!qEl^iɮe 3]1&ʊqQ 6n`6KO-"+v|h̋Υ/`0Id+o[N3us[_PZC dVxa㚴BIPl 4%UܪIx_D"iK-RL{7C<1R ٺ*)S2+e&9U9U%Buoh}f1Я'RLSkQ&M8@ƙzU\ʴt&X_W?oJݛ侤nW}|E(5,7rJ> +AJ RҺ&JSԮ&J&ojx*TLGBaO@1pXI;ɿ|vEzFUO Kd}Js"0#i*mZ Ye-U>3ST 0[ӆ?ǰ-K[z5; g'{zl|"R[,P/k$m0ZLk~X5`#߾})!X(*~@ʂ~Q_]ۡqXyH $f|Fedxl}_X5^p|U; %#䪑( kwp]0_7bOE]U!r@E”^nNzLd>+ t; F aMfh"Uknpm\`ٺ1.-S&+=~+nځy̗5TKQ2,[zИ|;T:=BD৪V(g;x‹\7 ee]O 2>u;~'дDCjeJ#ߎrm4oel|._ ZTɶ`)e^'?E5YA &b)kC],9lKT^ډ~YiJqTQʧUZW<:CMsOo1E-^!+܅.a6l,j *Bup|s UOj@2LO[Ā|Q|L"v\{gʲG}M$s/T8R9BfWѿxZA@K&i]Xڊ x˯:i{`X5cN[ %$=4rǪ7sǞɇfN#jܡ >B*"oN nZOKy 9; V$>[}֫>#oLר阙 I +±RsiF9imu2̼d=bкiE6ZH gQH$U$tK" LΖw*%}8cg+fJܒ^s!]0,#KdZ-5V2J/<5q6ҖK%f&CVce1+U %Rj&-1^gz EymJh_߭E80㔔.5YQ22y9n׿D"Wjuj:эA|H M9#O*8Oi])|x><?!6T\0z_},2;ӕ$IV _vt-CA$j$ݑqkFrbg˕vRG|vB-CeFR.mNu- `xEżEV3rU V>vEFXSҠXa Q# Pk5k-Pu2;*EIBJ<497ɻ]/<'NV=;VAvrF]zK)B(ѓs]d27!Zoc5dǖ-F=DvgX"J T:#RZOxxc3#Nɋh* xÔp}%hvٺM-q+;g'k@5$CI#1 I" QZfB" ԤKh_< p 0&ʠDJej4*!Տ:狌F iR;Eob:#`С{rdЃd91Cd7Pܝ3pIک+J桤_9_ƥXӐdt՜.GGɟ:b.ظDxN`Gf0>"pXHPDmY/F%lZ P(9< Jqm8R7HUxjHBaEjyܶe}/Aet ~}1֯.oZ|'-6o{T&NҧK= 0 AZ a P"#>e)"2 #,Ь=x@cIo6405<[Q)h44}K)Z\޽QCRml> ޽yn5#h"꣱H*(au ֈ}nA)I+v{,*$NdPPKHprwdܸN%)S-IX& Y!暰g'{ںoLO&{vծ6_ٛq?˯x}VOvq# Cj H)1M6$U x-.H(CG2ĜtkUk}ުV&ײ6}gg]-YFWԼw3Uz%(H}#a }Svj^Vb'hTMU_BR5N]Ⱦ]$(1( Ea$e^wØPN'x=xLN›}wmRt_.Y_1ɞu4$p?/ č[Zg:Ur`$g٤ =˲ꕔXKIJ&K{Grw͝_\Pt8>V8,KS|q}wARA)>Dߴ0\d̅fcхVXç`!Y3]h$#6;Ş2zEDiQⵓPdl>RZ'Wp80bpC!?|ޖ̺qIc4P﷭jR9nk݈z [XjׂAZlilR{e%+I#v,UK|/.K43]Aͅ]TJpӊėuYδ(Fj\$%jrh 2 8hv]Jx?.ubvzE Ͳ;|p̪PBZ?e   J:BTmv[aRL;e3!bSiZa`!fotpfBRTմ$m<{FN \ɇej5 VnW*m=%ah ^RcԘa`~z6[iü suO"VJR:'עgT pc IIs"5r$PҼ6+B5"ei @ZHlDrx;fUY=DSd҇@ٔQ:\}E0Ka](nKz3GZp#_1\7ÿN̓QoiKgٜ<ɔZk!խ\aLx_VF sg."."AnP9)O#w 78}ceJHi% 0\?'vs1uMO|oJ$Cjdn۱%$FwxHyH0|(W0=Ӄd۰c0ţ3Ȑy}cqM!9,•uYlK]mٵXs[a4.%LWh)طQ_֣hFԀ9~~;JQٳ&%q ż\LaO`3!u7UÀ%hiO.^H ՠ;ҧzBR!)]jj7 tضmb>mk褋q79iL bIHM聒z êIscs?(TU7NP2{b ;} zoc<}iHA2'eu7rCjװb"I[vGĠ%#F^o0zq1c_ g MCְbA^)aR7~9afk ]R _46T4*uR,DBFjڜ31s~yhSxv9C0|Á"rHI; 5efޝ*@碤/eA)_ &<p!!Ҙni0q a,:RWBjI [炕B#ʬ$Pze6^Pϩxh6eVZRԬN4 9 &Ėnkm~V6Q!BbѤ"i_$BӾ]g9F'ϭvUi]rJ,=*G-u8X*lb!lGGUhX`ⅰǰ}AcPB jOR뒍DŽIM|-fE}T3 Z x0iP~K@N B„ҳ,7@̜`,wJX6YXV¦L#Z}DJ(l/ʔn\rq 0ߟa b Z@Dik%AA5 T)SVh[|]JTSqNW&VBkZ&/!m_C .SA 7.K}Dz3X Ȯie%'t *Ŋabō֙QCDx_AlWj!15#]RɇJaiNdlz7e9@ٳa $x8)bQѸ3ՐԖ֟Um+>K"\ka"V#qI+=~qVHk_n4~g v9$UJ́!%/X6JD@c(zRr`2%uTʻ W-14XC qT9!F_-|IQz+..$ jp/Qzes SllI!ItLբHh8Q^TDimFfa辂|%"p0{)20TD[k3_WzIO\1<5ō4k-\30ˈ k |E>;ӣٳV"܆=KMjʞP/jC1D.$9`0]JL!.e: IOA .A>cpoi]γR'DZ)\dVf}Zͧ6Y:Lz.:r_YFI2zbh(&|$GfZ 0j.Sd몞+~g=[Rdc”[CarAt.7Oo)jUnlӿIJnRR4-0V(Sx$9UxhLjk}Ґm}tBXC+Pϝ}DKG?ļm,lm<. $Ī$:U;ִma{J:B]{WfȺ.4RliB‘e؝pǬ T`>hQѭ1m}5exY!eHrSpHKni <_."r2^G}I.)&Tv\IdA6$U>>4 0_aJA-}IJJ=/0Ж@]qm;Gq`|vBTá|sHbcV/%)d#+\`Ec״ubÕ,m{P2=(<) ԻhB-E\[}m܋@`tZ lNKC IfQM-uE}EA/+ S7V$u)U::v7MxάdNy&AJУҺMcZwfJ^%6y`,[,B$h:PDȋYWGekYl qyC7U%9 ]@Cb2Mpd^ :l&{JYW'.)OvY};o~ R[0l2&”P1[?YjJMD&=۹YL=Hd^m%Z. kQȊhM 'H( bkw0 <o%cK[«z/%h4RDzFfۛ&𭏀l=s/H,A~$E1:$i$ׂ(KK{b^&+UNv:#]sKƖj/e"?R(VhmS/)\ )s:̥YӆS}vi?DTz3qXnWμb,ہElBl%Qϩ*;ǩdǦ>FM lI3Q&,DR|pԅ>V*l1aFڪFsMc|68MAY4q=,gIp(׋k7oսm[1+@W˱르#OÈ;m]"O ɒW'-"A{?"TjO ߆OXK*Xӗh͑XvbIq];R6sMݦ"W\_!A14 "Hߚ3,@h;ߺY:Lߍzj]:!1I >#D\_\NxȫˑH0+PJSEUݭZ =HTi*_ݵW6O1vs1dnJ0CMSM'\{<ӏC1ՐƌwO{}hep y$0{ض!h/V_Q?:4(>c~[-;+Y/H+mܵ'+?cF;Oj;kxGq/>+^ 0L5BY^b Z+&4} ]ôw?0>7DPb tc31Tu{Bfݲ8$ H4X.Z-W'7H DLn8(/~+3itR9KF[-µvzz0_8pzZӳϲ7ACvL2av yM}=2ΰ&״7WXtCyAz^+i L8?QpZ#z?n]ۺo'oGAſ;\8};3:VPIڍ&`Uge;\joI ,"q5-\w)~X愓 dg)ҏ)IŦdJW JJ0۟rTBzH|_9s$# l-J;K&…pv_sS'_^oO0j~r_K>JXg x`fo\4b(K Ӹѝ6>aO춒FpKLM㆖(MO~U\| 0ǿLiVAJ1瘳lŵ WKb1L WpP.f[Ѷ4Yg ˧/LǶoGL.hAUx05e|nה4QSVEBMa4FD_b4q-Ѿ=唥n |>1:Ӷ)2P"V|vlK/,o+BlHl[i' ,#H6$$oL^]y8|Ɉis{f[IZ-0ŷLJΡËc/ nF$iv\ik~o@%G"Oʳ?*̸aN,T̽bO * A~mMɎV0PkYR.4V^-xRet\RgGϗ򬵜M .ה塌%kJçvKy?eB}-xҭMڿ*a|W|tBHve֬atܶ-wIܸ6eӬm)lQk|DA"-ꦠZe}l0[$/Py!=ulPR_L=6[c$ EL: vQN8""% kz<6spc4:y̱-6s3o ܁jV4X+eil+̣Y2(Oӯ9(;X Raxp[O؞5f*U(3=,(vg1i'3KjݯL&$Dʝ6 ^_|@9h| Ƨ k1 ok̳k_~+s#mU%߅?D D0@2P*Ô?2*@Y=FãHՌ C44T&hn|{* x*`زXA!I}q1u8''=ƶHEl?Y'Ig^/mkZc_Y) f1k%LOy.M!24Lr/bR<벿L!9,lAE*B| ETݐ/*{@0!CJ>wV'j܅Sb5}*1v+ cݍ~MXq+mӮ +=YžGWc~s˄z¯EkzDt F~)Rّ,W\ݿnwr3C"xnN{"p&,Ud}7Cq7 #%G.JC@,ȬєzK!/4ZdhMR\<#=4 ٍhKǓ\'== ! 9{>V:pwq'r"*<#o{^Я~ZETVx?ߘ-䢢QHˏrtnttfqt32RL` vT&LȰ-^Ze쵟󙕨ȇdyE0^/rE)8pN4R?~vL9|$m)!"wdp9+twOٖA[GІ%6b%9k 5=LZ l[l;nqjD ADP$ y7Q0]%g!-ITpd'`-EIQJ5$Ho4+mW=.F iTUP%(p#u´ũ˱9Ç199uԤ N;uN#nt$'$D]d7_BnC^s|$/GΡO{{[cat[!1f* O×f$`RVB#+j wPQ%@c$Ѻ1}s] ` kYCi+4X2.e.)Ӱٟ=I9O5m h)PLҳM:)pI$ ͠yl2Y9rdr8 ?kZ;E^U[leUO*2ZwJ{8LjO w2TX-B<ѮV/Mat̬كsy>UrEO4;tk*I] eQ9}j s ݐQ̡U|Er2Gvaey~ l% G8>B3 c}Et Wɴ+wV"AEםg"f Fd@V OR둿v׵F^τ.IWu5,hF1I+iR_BZX0C6ڛ~y,폅=n U\nsXsx'ɢ6B`V M"FTd7%t'CP`8ARۃ|K`Q-(qPؠ5,#-\Or9~TЌ} s|褾%%]K4SEud7!K񛿧"d[0zH,& ]?&wcvAtc=m. sx7۰#"Uʜ$@~f Xx8veZ_{4:^m~h33y.>;,3LliZhb'eQXO,~-hvQuCS5M?2Sޜ$MA a Qy.]+~w!2Re 05mgeYL9 b|H nF}l4<2JWHTMA&ҬtEhR<jOp}~y, ڵ#qbӳvA| IAmBW3S#e_ݖ~g`ӟnNŵR%^^ PYeJwWpKͯum/@58s;ޒBJj_ 0J2OtG4bIT!\i Y Jix]u#, 8ByCzIو璊oj FɅO+(u3] @c\J\JG_•tx Lr:/d9CΉgJ?ܿvJNb=mM?&\~p:`nZKDM~Ν-T%ҍp5OGMVSe~/)D{ sOGROH>3Kzݰ0vXBMpe4ɚ$% ׃U#~Ԍœ:bͅX(f 6;+7e)q޿m}n /(Pp쎭W?J@>} CoP˗^I,LE.a*(d]ŸKsKlTH< (4Oq9rlmUbrag[=6=yc@6_`hD#ۓ'4G6:^GQ2$@&3uΎ5ʑDM0 ͘ nC!&CÂ"*sL,B\N*j@miW{nGwNI߲ VJwn Zh6̧aoqi qQ]_} 9_"^/0mmS˪La9YIÊ22^#*-w=UU&/yף/AםK>jNȍqlwpadQ:+ #/i/FLۏJ3ZF#<8`i,ְi]74~B~<8CP@fl/B;4)n0YWqFEr!t7q(炟JR h!$`6$^{<XQ9i\%@9.:޷Zp.ieGxّ@=8I`Yʲf[@oxK^=7Gk(` *p" 5R* .C+/zDY" P̓z% έ0+]}>_bC~_?A#QG#څz[kZ򢳎MV\_jub\d@%NkV]/׶)O#qkCpe;:݄0(,.((70= >БW.Qц2V/datH&"O8㘇)rk$E0_b[kuL w,@pc*?Ȟ5LW8B8+dkփ,UꗫUq$ MXfi1>?-As3Lb DdHfځ1AkQF=PVFYm}ǽaK]"x3̙Ο "`MTú_! |RUO0 1:2\yt\%Hp!jI?@{WQR}J0Ie;SD$ތUox5(P1}eqZZldI)iCKkOq"T#4?}IPLnZW 'NOaP` 򆭏(ƭ{Uu&|MBQnT-KKBQ-T J1$(-"G՟1?}_?W1.藿y/`ί-sj ˤ`pHU,T&GPP@tyqh' ܤF積4pF@ϋjUq.շ~_\Vh`_DL $O*%H66(BEatUr e0B~` ǰEhgnjŗm ,m ԞϮ,©Q7t_^1raz ´4PjBmHkIOƭdm2lwڏMo͆Nr+9)T{ZapAAwhQǸ! ΰ$"l /Mai^Y6EIFR˞8 QP}Η,C`}OPnٔ[+@&YI`.v/KNykK㭦n7N KJ 33J|Kg =)a !wr u[ڭmpZ}wllj!d T&đRum6þ*R;okl8-F)آL/E. @W() M[$:pl[c@?gm%ܶUcIA&;,ت@( D\ƷQT4D±̢9,"'$66 d2nsfُnHYn4'hV5ޙ:{gqe]ñßGqڛlfmKҬyA?a |`T1ӪƚC#9c̖3v{eqeeb"ejD[at^j Mi_4I=,Vet#c2mL~9u8\ÎcݗiʩQYy& [˂ ~i9T, }$Vņǖ*# 춹LCFk~>;p>#5M63{NT.wDI3D.mol^ͮC@ͼP^fw|E$:FK1F;G'v ( tk~iQ[.wſ0G^ BƢ==FƂ7 lߔHb7Q1PB m A,I5IR.-p7,ݰЈ.]+=+a#lqp1'|IgJ[6{!gwOM dr,VaPH$Q"Um팛iym3@=t62i{$ /xIHA&, bϛese$/٢%Vf:o] m<7d!yͷKK) /]+7ӋyxA.EAssRXm>J1|585Oږɾ!_X-aP_}nj#gES O·׈j>d%KTF T8(w +UNxfIc7Z礲BF(ʐ-,py4-.Q3 9p9mPvA{cJ9eY9vwpU:I//u5u#1)BQh3ebh(:cUp%)_h""K66ܼΫn۝_5R)RWN=u`|nJ*ƋNo?||N]wz )Y!ek4$ Y: }t+ h_LJr^VMjr4eA6Vɫu޻12WjIXaOMvd~>^T۰N@XgmN{%C1ؚr` =x4cVsY_ΪR3%%EX'Pc&MF+c]IDpW.y" `"f/t'"t x R Hm?a- BCNcSBPGWUmVLk dj Xnє6cp{; RM9i۩ܕŹ+Vk,ŴDږ@}B JHp{NMYÀaʭKZ9jk# LQr."M ~0fFbu&Š HQ) ZK _ dE@X6pkLs~b]K΄9?v B5R⫘I"{Ij,z=b>#1,r;Tsȥ+NTG^ޚ RA2}ЅRpV襍#~_FjFߎw3デ &WFm_hh>T-y!1h*+SO3R)ly)^ƶzMy+]m4~po+,19BKIT|vW"+a5YgQ@iiW (UK0ֈNJf$]>xO]^432euNs]/+Q5kWXK֜d"ς{P\t,%IbXIS<8}u?$&#PF hƲ@+RʚK?W.hBy밿b@ U1Fꏮa.+ :61]o0|޸\&0k&Ya"q!̥Q5w_"-dva.JecqLTEX%Td>ѦD&Z3n?pxŤMӣg%ܦ[ͷ+#eJOC8m;G#˺F')$%b'c 9K\ I-&C%=/(m<+{[sǪEDK(|ҹ(`!I!1 ٧?_=e y%H&` 92Ll _0g2>%.kW-ⰗM?@oZE?%JaԖ4vcaG҇qpSKJV~kLL.du}pc5߲撚2;6cLdSpGK:[ O Z}TZ7;B%#m :DNl`%cR=qMj sBwݯ2=5>a/4#BFyA'Io7ak":c[Y19OAHF !5madQ_6b+4ǧ Pe4) 5~sc7?)7d9_huVxTc33RWD'PB<?!ǚ= l4W -Mxy8LJ՗|| U!b 3YLWh6EVB[.J}ɷĀkkFlK$چ" PQhob|=A?(:yӒ&:fRͥx:q ?apqcGb[۫V-i{Wq~Jl__OƸسk^MuB—AiiSU:)# ЯC.GkMV C1Vq~w&9{4{˞;ldY"ƊdTJ#9C2a+ GWKpRCFl L.m޶ zϲD0%;D9M >Yv=,F6Hcڎ'<'!0Vi_Mسsh49SpWfy[ :]L3b,GгbZfO(#tg' 6u^U[ h[pQa}_@q/=("b 9h̓gX Ca;vt©1{s ^Bm|9/^Z!fu'9x4gf^NJN#f!HO-bG( 8`_4 ASL͍4pnI2]uB ,1|kkFȺ]tj Ybq Z+Bu HmH}NH9᚜$m<MUk򢌛V.^SYS\S2hq6+w0Tӯ5Ip+7%jm؅]IiV-fPfrxi8hCJ^$s~#ܝ̰P_6X) ʢ}@#Ü/ѲTxĺǼ!T%AJ?P@|ڴfwHhPTf <-El/.~:Dg\ IiE3QFgeձc7_tqt'@I8C@Eb~omc%04OibJ_TMkfK|)Yt˜{EWu~<|!%i`J?Zh'Nt5+yiAp>&VgsSz?aagS\n̉g'?T#0h) nޑ9xcYϋޗ49P )k{zm-~iܶF@ ձq=kIWJ>Q%epJ4x#pIĩ7681p5>#4K%3[?vA7*z@a~SWx)iG5=O/g@YBD]ϙ)ˡZY奫WnDi ؟EsjkX+D`- %%b#!ZUh0Ķ$.P-! vE_WMĒL8A䑮O k}Σ["s _~@{?sL& Gs}yU?-,E?&N_h=?B /<{3O@mq{ubTwG:2ZGt#TAbXGۗz˴YKM-|%es,#Tְ{}]^9C"b͊ZdKːUgr0:̩qYlODe b2F0l&emʯ\^˫z1FG=۲qېıj}ʭ4J`6o@!uw+< U~ɓfKIkPCL:8-qhfb1_hrM>Ҹ jf^ kv;]}Vi九f(0zj,b-^K5+#p"ش^iR,)YS0>"[Q?ϬfVɢ<79L}>{Mږ4ol2]b,҂/_Y]?\~θ.fQu֌Mc⮮]Y#vԴX' Rq SiȦ_"¡O!6[@Yq%2#0:s[m(y*a hՒ/Hh URy9K_%-:Ǧ-˔W.W:E Ch$49m֑^$C 6tHmZ6Ks7=y;JFy1m>wYirMa?uSWt jcCm_i`u4o)*VIA&ąLRЀL&FZM>%7_ɐAsJ8 DpP6)  K%w?\e$<3UFABţ67=MFހWCkv_Opjo5?i#:dL~!f (Ӝ-PB0?m\S8pyP4uNf%L%C.LA5'ѤZ0n5a!?Fܺn + HECIHpm:r9,@XD 1K^=|WVYRT@kM&pN (m~JKuNӔ#b;U.lGS蟶kc 30vm !s#3QFWm ڧ8V.Wx߶EIcݚI_{cTMO_~ite Z oʸȤh:|N<{b5ںe2X2Hz iCJJ5Fw5A&4{s8lx pi [uFQH+EϔH|K@,Fn-"'\LI]@l,L67QvH,hg&<ƥV"{Rw-)7g,*1ILjǶ+kC+%&jjM|p#a,Nط͜􇇏_HIvY3 s.jU-7?=bɞU4-yZE~MWQ1'm}ᖇ綦mOb5@T.j!=9-wN&lIhSxI}^a:MyzycjxQȮ0>R/ꭌg3)[V\_&kMaW'G^DvO2Ǚ)S|Aoap_HI򄉙0qsƴ ޙhp(]QJQniD] ڜ_I;H|6wQ57//v٭Q8Gz'wangrMdC=(z Ki6)l-_f_ ;9N"1 Q5U_>e|[9L9cD_3KBCW?:LK 7M>k0VXqB97vA?,w f4rrupϯz.]mZ6zjG ncELG5C2:$H2G2ȭ Aʸ9TR4Z嫄`:]w^MMAE QFAso$ /!zy#2s+1":-~EZ}?~;O ӶCZ$$-膯 p XuzmkKOf>h3kأdcכ]tO7Eh9 fL`74+XJ9w)mvf`€CJ66O-/ hV[P⺱m9 M{~9ԓ\;L$YSH`j r~:2X\Xq~͙EE)|nwI^*9U,f ⦀ )I &vm~S@C%ZiSP AiTcZEId`ë% 9 zg9|SN11<N;V(wPQ7ym,X:-QV] g-Taywc".,Ț̿-#*5,V0Eے)C}>ΆSR?cd%atez%זu3KlL>HdS^U?xevmŇ~\J?QG\S +_Z^KG3 {3d|}g?M"X|bxMŵ yIYG!x/̬!HlI[0f%܁x5*0Ij~k@oj;*v9avi9tO.Q>/5&Iq 2UdHfʚEoX%,5PmM# =m/iV;G={ŨW@>/+.L sG&%]vGx"ɶ5`3L1=vA|C+$Z7s8R}aOt>vA?yc]'%yI["D"f ܳ]ĹZ'C6pŰfͬɾc۶+z `c T;!-YtޱM#Qt߱c ! fhR,輂^ _V`=B}{ }\ʯ60Gtr)[%\>{!Mx Kxj0/J6rF4d]ˊ̃@:4ҋاD޽ɓ \3*G]]J⤎_0Rױyl4)=??\12p¯ bJcG:^<*ꥸ'D"Ugۋ']\Q=ivŜi;roQJ. @Үh4}q D2C{EJ\TXk-ޕYԔDsr.#ƹ"Ȋe%EKi x=J~cp6kqvo> VLPBnI;s~D6 &! N[nqBeeZh,i%Ho8~Lm <{au2`PWWX/n@?zOCq&X Rt&2iZ;'m(%jkH3eC? ӟZ& 4IiTJo5y%4.ʬq[ j`I$Voooa?DʼnQ--I[8{l &V׊'ybi>(Y䤘.܁Vӛ~Mj~i|1%lUC1%Z#icʼKߝ*I~&8GҰ"_@@o5c~c qSp[tg->=(Uz?L ywHg?$u?X,W%h>E.ASp( Gj~TmEell;(mlB7fʊr< GzڕoJe i]m/*}pU "{w=r:2w ݮ"V8(Xt3 R)i vi#zM320=c Be(c0cθ.w~*zn.i.*_S_nR/D" (#* ƞ ݍ*a7B0m[HnB ƮQ+,M& me)aK&k11jG@-wI_, ~`s~& du)tq~yG5O y%vA|Πw 2/Q;bVg77Na9#%/|(wK89 JJoy*?39Q]LMLTm<َ(=Oc.ny6$H\_c$Hr7 6̑-?h"Ny[7.z#'€z"- 9w ?ƛ~i܏)Z*wop5Ǜ|M<#<#iutXBS~"i$oNaoӫ_!geTM؍-_BY`HaFteq:mhAwni|g ) u@ZHB}B*ۯI^#3j{7[^.܁BPkc)ew[>4R@,bsJ5O/lúlg~~h@1SE^E>p-|Pl5wps5r/<GD-ɶqugq_bCC~Y@Z6F9atϱ}i~36CKopi˾2cQm|E(}!B6GV$bux͹^R 3:.w|T5yr RZ}?H##ڵm׶,҃œv!# Q-9BPPXy~2$4~CB~c6p2#8ӑ08;5Mus oq1:p^(j^PTXvNppz=̰pz?&9awȂw\{O珙?b zg')>Nb̃E5 ~Ž[j+9FV sD:"iI0u`L U#4}B>p8-;b9vþ9uEȇ+y 1tWN?%ܜp0g3+N,rzN3z?2z2ݺF}ݝ\99'v'n֯Վ %LjCTlpuՅcز+mә@ ޘh+<QW1=L)N Ir#)JJĴ^:%%!YSbEMz?5.5FGCMdLIN<U<H%`ώR*< H?/n0 i `ul90ad\! GRANPU+uۡ#j5V3`&5''Z!ɮIL8|n1XLmcCd}5talkjՓ#Ob,H8,r'C pd#Xgi37)Ƕ_V==,d8Jq~1[.+֤0|%kǧs fRVT\&Kdܤ+7+!eat5\Ls1_sMmm]miS ˜䄴7NBXWNzdX2%PVlY vmҵ}Ugnͱјgrbps~q6&`M~m{=^wbH3?GhuqDWWt'}$YqFaq/mpf 9‘: 5(aɓmX(2$NIL-ڱdDQ dv[fshKAV]Ɋ<2elǸ%i}GI\p,c'܁~M>OO4#<0ċ(nxDw:MNllza(B _}^$c,ߒc& R^c3qlr]WcUq)!z ,5qsb[ >ϑ $&G/ W5܀DHwPFS #47 EC꒪O_tZ$gY x "B%7?kK)т+] ,*[ioWpwBP4ݾSJN1y͓-big?i¿M>%0U ŤhTʰXa2lͰ3n4> *И{&i4+`P'ZV3)ׯЈYtބ{DS;msFM=2QeL$%a ) ڛtꉬ1 0M瞬%Vɶ׶#m?^yn$y-'jKBiխ-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`+s|P,M|zs<5K6{8m[28V7$s&VR*Zt~,Bnz:n1|WҶ4nI[RALc*hi;#|8;k$fur&7ykbb"L]_RL[[xTTb-Tc|"r, \|Im wt&ZGBYwnSBkf"+,P-æ`gLi5%nƚ|\FaGݚrsn$5Lmh~`wPp8iGT# Xm_]¨^uЋ06@4ݚÌrs?m2#J)wSVIh/8ؘ^q|n tuG1X׎#^[JX/&ퟋt ;Zt)+I8U)]Blf2=mIsf92S ;>wgk˿ V2k1WB%P%YMLbI ft<ʏ㲮;XmM5(~yZ.#.6R2NP µVk(oYĢK &fqw޷&ۮDz< IC5}HTb0rixهQOFs,lB9:3_82_r[ں/KH¨6hdEx<'x<#!nrVe8N狐0Q˸LuW㙣f=0 D訜 ؑ.ݳ}Oo9rꛞwHZ,zT--te.|` JBۙ}zTn;@uI2;(7@Njb-WeWuUQ,XEKc)d n E' VCaNچG9V(VZdr^*/_6[{ri:oɪG4(g]sM=L|7).#`44Y䟉=1rװm+Xq%@@Z)~Tmx6aaĶsH!&蠅DQ [f?H5 d!d 13$(!%vB͖&ƠВWCcN5g.4"a^`~!]ve}~}q~OWK K\%ӥ4mv0Pq͚h}\rIr|@ dTN=dT J᫐Q Y-i°m.쎮:Yy=l?O/Dzokў5062gZ+Z+_&V*U;ka QMr+/$FLi8 W%neӭ_Z5$IYl(d;>l26n!#(bl3 Lofz6s/[1ߔak*qDŇ@:KSny 0P@-oSSߦ1iB}.]m'9iA  ;VK1kIBމ-!jUtAc);>~iGlZkdc0m@?8 1ZKgI.orm; Dbr2r&idXV&ª r>)m!V<=)mAAºiuq0:X wbئy.&hYU}Mc3[}>44>.`EḝkSY۲OX-0@ׂ}DQ}r}r,ԛUM NoYǧ Ƃɷ%^1zR_QuJ=/ή %CFi&P|EDǒ4j&I T<~[~Y%/2bC{XqN$. С40C wP5({۲O1)[FkS#e,ˈTbq,+wi3oc%qp;G. wVVa{qWƟPKBjjVj )PiTVkw ~v|~U\_Zv7'mq {u囉-2eb"xdR>~RI3=Rt%}0ʁY,YchōLqc>5m>=//@b,M,K ӻP ;{٧Tk/B&0d4Sgs!3L9K2Dfwa|U|Hg 1p'k?7%a?X?3c.p GņB; 'kw@*h$b&2MAKlPdr@E(1]gw=Rbc*.*/]+/,~ gz pq~y,;# K%vAƁscLVD0 R51)3Fs8fuXt5Cd<5}Gbz'pU+Zz12$\kwTx~\ Q{^oD.G:@s ii;^Y}74?b5 #Ybv?B~CƘ$X<*LD{}RL4}KTW2nK Qմ-đPX-%kXMP,l VG$ŹƉKos8L_8&Rέ.|i;ot}~Jd@Y2d"S6nOZR !AB^^Nvd<62I3 c=V hĵ$8/'⚄|AD]Gl5cxǟ(M</=T\N9Hjr(w'$8Y*$#H$hXlQ%E bn%~A`El-!VUtsf^-@ :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-CmIY-%l7a!Ӑ)px"{1;gNgђ~Kޏt3n +,2ePvT.$2<+i?Mt5S MnT*-R({?vx:g*.~<73(k^lp.xXضE[hþf}ߟvҶՉ\Zɔ`68/KH2;[[D/\ `q7x8evoVQ#9_T0Ύa@5_2[]~b&I1JsӂC^ΥT_ϋ%P:C :'ǧ9@e܆_7m]o/pْ98Pu\;&֖?dD]ؔڄ5 O '~g\<J$`:1o̾Q$#+\.rX&Rݡi!-;dfQc˪KƦ`oδavq;/㌶O\s]c5׺q9@RF 2@ܳhDz!KVK/Ns SkŽqS|Z.lJ+KTS$WFW!tKTL3ê>UQ¶tc ۓ0l{s"`7qcrSFzJEϏp"БWx=Y9oL}orl9-V^Wa}ϛ;4x9@JRG2EMҥ'ڔfcm[5q+Q&Lr-t밭$qdࣄY0ȎHNM$LȤsq*sQ7dŤɮs"3QwFEfQLS| T̔|Ko6>C-7i mXZJH2].~r#;|D=d}cRuoS(^?<JI2z:-㡦Y(,3i[ee蟗Ss{uvڝ gui7$ȴRm"\mHлJh/aB hIY $j MYcXHSM\};*4"q)Bvi./lrZ\miΔZٖQ&6OZ(S㐔=GR|ct_#1Ķt;`_ʅ#ө{ғ DrAmk^^e̛}qV: '}x7wϝm 8nÄC5 <PXM@a;Ͼ'4 t|-Zh7ASB uUh6,Ob +x j5m+&2-쿐^1pgGT[@ ``}BƒF~Jp|ʏL,Eyy5EEG'i(%fr&` Xu3m-U?XjJsff%6/ ڵ3,4my彋mJ!\R~~-$s/~4듒a̿=9c2X<3Ǣ:3fo䋑Ef/LK++(/Db M0p _$F ,t@? 2e& _͟4: GAZR3PA5'/ʞ8eOR-P.һ2tiZ]zjW 2@&ɥ#隊Ù㎡m|iK{ %Ql\[>mn4Z#Zx)_(q| |l{mlrQO Jya}.vZYІW;@7$1&^p/<®ޠuKq*l _9u<$@ݴKIe RPyo$"*RG7+`{nHkY|v{:ԶSUrB % %:ָKmLYKC`)6x$9'Mah#;êH_;l2RE[o%k{dm հ;cf:>?,bG=GKz]k5~+\O>i9GJh1b#_6c.g/nP9"~Fq,ݏru봮'y_(:1ޔرB*kI\LH@`~>vnMa缗L'p"+pNq~EL8A w?]=wZF'ҕHdw'al\^F:D 6'R!Ւq&*-q|D eQkʚ&tÜ Y`u=< ۰%VFJ ЦH(@sc?@M,NRƏ,u6Mc:JuDݩ $!"j2?$Aͷ?4-e GY0 &`$\F$OR+!yC2~4u!Cڰ7z/O_+'(mr)9TXHt3FWpm,2?x.Yv-xYyC4x'ϋ}W@KoVi_ ,NE[hk2#">8VDŽ^rĪy4s7ChChŦѬ: vlBVb]DJR)ĉb>f6wQE ]@!t!GvʬbwbWOmtU,m!}Sz3] rwڸ>g2] d{=sFJ tsŸEhøgN$%`q^O=-¬u5WatBP& ),drxZ?hJsAKឬ)`=-i^nqa-C|#gJ%B@I;ŕЙW"Q&+ tؖ+}xEl$캟ڗZ_D5U6.ET WPM]3Ƶf{jpB԰1GAթ.RG¶y>Y]M0$=WdvѮT)@T"ӱ eXk DoDvE#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^F0UJ^TpQ:N%!at;|(LWTQ`lMYXbUblU%u- M =e8|qy Vw@2Zhf΅r "Ľ{3쟵-uZ^Zx 7n{KІ2kFi j'cžtWңJ i SAO~Bމ-@iH9`LJ_u0q59wmj=~:ro(G[y['['uVF×d$FpHE7IF%0-S%..@Lf N p2ʠ5`ο_SNW ,U]^ָG9g|aj9PŨw.~AdxS9WX_swWeX6xX%{j+׸Vư* zF~%:M٩?2t Ce(;;#0w}A'>eO2B'^ zz!hLstʺM? mܝ9GGu*mMz&ɏ#?ѾIb(Dc8x3mZ>6tD-,B_I?v'%I"G6۽Wiqu~Cn5^HM4ъn)&: +랑&)v,ZVuKνr6<-@\96Hz#>!-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^3'+^׺{`= OelSlЗhc~Ytn'i'QǾeVD$eO$(a2N*II̩Xln*MT>$ s^'wLTH tx>a c*_'#vt>q5MHxR)h͐`87 nfZ阶D~V2 ,+H}+~bɯNEUѓNlb0Yb( bB{Wlu|:9mݍw˿&?hw__~2jNTs7?Xý:5m^[z̓7Si1_Ú,CR|# #hy )ܾ9w<,'x!rgc-@oA3ppKz~sq>)YxzjQHxi{TQWF"rt*xR.48}h*u&vZ^Cu< k}I}(?#%NăNF{#_WZ :^x1r%= jՋpG91_.PL " InG~zf U+QK*&E`do.QVzMKIzm{Kq狶qwbX@̋:_WsEuOk.Q.n {t.bj(FB9vб|:W͢#Sjۖ @a B󁗪¢B$EU$JUM7?mՖg%Cb-Ayfw8K?3˙ٽO?x`@'8}aDᘶ6V0/h\hUF(,,Q#`î+%I>`2$wYGknRV y/Iۆ{{ܴ? hb\UZ'GftcaɲKu)*^<8s;7|tE[hrV1m{ls |YLxT*oΓ Jz鈇:2|#%q\;M*80}1BͪbXWm^ At[ S+4[$;f"\AE"YIغ ;Urԝ>ݔޚi ;zYmUoTA+ 3wpUj}Ӏ\~"/Ŝ;==ϛҴ6Tɠ"rZ*ϨBQB%0ZX|\ߛy6}M|!\6L}X}>A͜B bb>eP}W$_ݨ)p(ؘCQ͜3h,n T `D@2/numx1۔_1qO"hQ84qT9vsЁ꼅H_Wr0 Ld} 3"AnWE]#Zu QZQ.*Npb ;=pimM/bgM0@V" @f\0JuuiJrxz([iz>Ma?p1+_ߙ{kS]ԫME ( KZD cX,)֝*%4MVP!%sc*qXqi(^ g[U9!mw^њ%"7.?Տ|8*uΔ)Wej$!"/}bY?䣵X=.Í0n{ҋ"_=rf0bK Eqi#z>O,H9H6Yj8's:n?0Ʀl MtOmsVkMDpI"$)Oz EڕS%终dq)=iJkBZ0}@T#I*2E^C ABb]GMiq)9%EAtiVLQWe erks dա@UB叹j6#4lFiD׻˻M p|X뒝{Վ@x W&NEYffR zݾmw~~ߞ-4QwrwDm2/0p?. -l˜Ti.zKqgḨZ{Gk1*kܮ@aO.)h4e3 -b x txu[N7 g-lp ?p-P{# /4/O'$k$,JB4VM;+xOMyD=U8ӑxzN.}\L>65 <م}}3 Àp=QLK[:Z~1EMH0DHW˂M[J}ZmRb#0҅ˍt^` ̆KMU:0 $bD0´'YX@?-!MS- R_q_S@7+dDа?_}ܛ/nPaL0*':OΖ"+AA@z]Dk>RHPMvOz& ~ hRp ~Δ $Zw/߉5ф" E':Xvրo~LڌeyG -X-3a<&&Iny@itԒ.ǧ\`B(=>9_ / "D+P&=Y qܱ677.zU}lL~ƶ>j [ ˺GNMPLv \U#LC!طGϴ)&PNz#Sw|ym}yui‡0L Mu3 UB7.Rbm]`Bә߄. ?zaP@&BNw"}ɝN"Hp1?_iEK@O/VJQ6RA-h cDA 758lBMyxa0?@P= [u)U[gyHש`ܴä1&|e0NpX-#wWP) dQԉts8tbQCbA r*5K¾C&eL?҄Ƨ;:fևmvNB-n$Q+\=3V H}o]?8[7%2 isUyOc{{6-Yifph^>oQcgLJ1<ϞMF:#WxC;t{cn ZԅUO! |\N݊ɝ_+@)Sm~.XꙒ!!S4 8(01a;:/tXx;o`} .φyNGH%~՛LNx@XD,zКt{zPK@Q@w!~Zn5- jG2X챟^%<p"%ž<^cIT;;c\ztNY5R Jj(WmL16S1#bߠ{YB䴑sf6r!d*iW7|R l͙8GD(v huͅG/?m__hu2%$!@$$IpZ"8rʢz)l#7İ ``.W}a dK+n7"]\SR64/}L/fiu5ئտS!Mb?:;3?}۾G%53atJ a!at?c.5H`qq\-|C)d8;-@ܽM؝fۼ ~I(*3`t{pAdL< GF7U}f"#/ S3!"[ij0LqgKofVV\5Sn>ŷ%ڠ FVU&@hq fIADFe,r0+]+6nQDZjXhI/_IM_D (wxl)$U͹V($~J@(ngR4vz:_JH\|OikBKX"kLS\)+\ .y6]`?g\=[肵T]6S1h0'so/$q7`U?y0ErgRf~d{oS2iriqBiBOwVi uPz,<% `l!ˁ%z;A+R=n l[Dz JZ ܦ v;81oyGjGs[(>-^UY#~T hLL@7(D 0X:yNrt&վ ^3w8D͚Ntf 1>|9처U*~1&~zϠvy\sHq/BoQ uجXYXiθj>es*lx=Rԗ)= Ѫ!6} !4EФ15V Tf_*Rzڴ.eOWP~&f? I7UMxgڞYM.m puxRq.y7]0._1`*,-;4@DR@D8JH_T>1%+-Óm,rW͛q'=(#c<9-@Z6S̺fHdגz^PЧؿ-yb]˶yv[Ǎ޺Eq'T.r6r/#Wˎ恎~u]qEeϼB|)]@%󶬎u7=qZ h~i^<3\,g9mhmL(y/_QʠMWMw`JH5},iLjwӢh $%G#drd̵yy:Ni:Ō g ֘ކ&-!b\bvM\AUu*'G洅]c[!}#1ěec}3^iFmwXjϺpu#7mκJIvfV jT7R.K[gכMk`ɰ* 3O Zy-U4*)^rM%~QN'$xLyڏ9qZRޟ]ҿ]fA{#jBC=E[qTP٬|Cea,gʳgJolOlSz#eZѧWu TT"MXΏ"v "T Slj_r7m!JY:"%g8xf嘲$}ǖϽYco&\V mτ51)Wdl0mO(:2P|wY3fig{ \TॸDҷ]qdAꚘhR@0?ؤClddTC35PEm  ZANhiϮ7mOV5T7Ksd3mq Q >)%+q[Ȧ䔈PbYӕ^L(4JT֢>lufj,MZw ;*۰8,NߴŠ:)/ՖlhaZAfϾ_ϳ\R7i S\vӯOԩpiX5q|"ü7^JfH79e|>J/G"+?%|1&G#ŎJg!zddiT S&ٱhގ F~Z=7A^[%XigLQ'vGڸQM%?5|H}R["(LK| 86jHb-_E7mښ8oes0㨶u~]D6h:N6}AXsq2'Dr 0;u$wdߥ#גFWmyhw IgߚB2-1#vDžSb*Ö=y=tM3ߓv$ʁW xʐqc'_-eD=Q7, gNv]М]뙶Gv96ml #9F 2@ܝ\/3Ԏ}y~̇ob?+d LL$,&ٖ핂D6$m %VUcqf|nS.B-6qʂhߪYfHGpLyTҦ`<Ǟgƍ2WiSs3f]-ˏ0w ^^&Ȭe}o*ͯQ?fll4[ʦϣ_Qܐ'-8f @%RI1%_T2OW N)Zxv*yNxN*)X&ڵ8&GSb^,.JF N+ D4N.,aȀGpOFGDдM{mlڞl< (؅YG 2p ζ?VfD^,3=!HSfHX׶LG<,r $u%K!O$Zp*M _L NHfl b^Lf$ g = \ڰ06~4Z~lSp=KLCGƾN1x =I<=ʺ)@ԓ]ke)V63V065&eNEqkS'MtKB,(Ք<$s LGS-.oSvoT+9bˋGE+W`6k#?1lzCVAÞפR9bfқr&A;) Ksiu̽Umd^ $1Pf=s`ъy=]XDV >MAFįq%qg+)E[~Msj;9y/*= ͪ%@̓;H !bR0ى^ '1g2D/M^lϴ8jfGjeLh;շR٢>/ư`"֮QfhQD`Vwq$iwXY̏ƉOu;,D^Kg Bs3M\1 誶І/8#>lq>o6{-~? Nx)_E9_rUq4kdtݧc6.;@ö-ǂղ`1Y9\\`"xqdGzRdY 2ohfDk+C/K{jT;ݠ 'H'nD6.Uяzvp)<3Ӗvy4blǬ2QƓpxj[Nj 2IR_p_>n%w$)~Hx-Q6mo $96#i:[8lcwY}{0W)^Ɉcq{:PfR֊*vjh_,_ Peje2@yD]04$6SlʦE&B&Q{GѴ{jr$c/ R9O vo7<@-@{|bo@{7-i uН]{ƃ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\NhGh$#q P܁317>^{a-B4g_ y";&hd<\=λ(\R oE > G7c],DB7d*f_}ܮ%yjX)@3xi[X6=74ƅ6Tby69䅬 +x^E ǗeIa*Iuz7ݰ͊S=ysyCP1zj I'pJ!SiO泟2CEAuBJuv|U=#a2ҌV,NM\f7 qcDtPO-/hmȲt.g};f>HxPA-iK}lq? )|IԚ%*b?>?y;??@KR ιġ0,+dCT, bЧ/NA3u|@N.L$NV)~h_t;K45M{B#?~xȭԩLͲe%P%]qQvQTF").*[ݕmpO 9߫qwZi-˔q?HKІ'mwi&ws^GN.is ,XWAc6m{}!R# :ò*ʞ~ lH K+Swei mG{i2tq-@{f%<)sT잇/"Ixx%XoF wӰi-Zaz{SN/;0)7EYuT2܀2ܓsw[/T]nG]pAn`#P"%)߮5q%pkzciZ,٣]h ʷ%x O< ?}BQ -@sjxAM+]7 jbFZ:(c._=mkG$mKaE\"~AdF1E@ 'u"\W Oۖ>I?v^9gL:ڏ؏,˼ԗ\gD9F#qM]:ש*͒b>z\`uZ}E:@]IT9 $i)WPe@ʻSI}m1luS ӮG+!% )iz$>$~RAmg<qklù$K_ 1=E )J HWZ2bu*QBuNkxLM!cǪz$VI+NviM~UҰ?*C7yq[uJGA/./~6'00Ʊ-. 1/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]^!  %,<3wC7ڷ {_|(JJaCP'Mo\WOL4y^OeH~jn;(gQjNo(I-PF_NPEiCch5$lRQ"Nꅀ@@~w(=IL".ַF!bSKV6o-ݽ+nۜnsg5aI )udv:ST)> `/B`hQUa@b.FkFJ 5 |G_< )&- *Wy5I\:(#eU6>MR|}h!~zB{aV-oYrY]k>O>ۃ! yOonؽ1pJs$8]))%BrcW'<WNGg}{6fyve\Yc%9ϖV'kw z\dXe<C{珥.S[ )6>ې3bmRVSDAI"; LMiCvܿn sV}~|{ .OyrfK=zے̖!Vm֜XeZ"4Gkڽ% O9eleҗMi m!I8 o]0yX0IG3%r*X@/m "{^4u5m0`ECwRՍ?EI (L*֬XWmi=i3趧v "5pi&ȒK3#05BM+IV]>G Wi7kܘ@ >|ƺ.^ҽK iʣl9G&m|p*R[n&!ii{l֭ }r VDIRIQ~@ JJfEܣ"徉2}W:tp+W ^QVI 4pTA?PDV8珺2~-ѹW`m){Pa۝b5flsW:4$ܺɉm4'@OXB|0 []2daoߕ~ wQ6vm+L ͫ!- ƨj(9k~ Ki 0R$TTAlQšv#$.E' ۀDɶ%_#D}H j<Ls4Nf9 2}|17JHZvx=Q\++޾ jImILVwiH$u\vlNt^x&zHi"/|+I]pjqD{- UH?3 WIz0Q2GG]>0nP<`!ާ=JPZ^U*.E<.zH|49j'vCtɢ 8LZ.QtC Ɣ-΍*)Mh j9fʳKbü!VnY5Ղps( v|nVO,O4 RG)`~;HIYR̷U¨_yd׶Hݚs)9Tf@jSD]oM&(~/IǸFD$*i (}mi~Ѥx”$*ъ`x.0I2H$0QlpmRY "zc9zLl8sGjG$8A& _dAh=4IhIs_`xY[y8*"'5+إ*[qJ[O{Xb1m Ôt|`Ǯ7L"AZRm;EΏ~l{>Sl~t cwkUu?N41jݭYzh!Vo:vOӞ=Jڹ Ql"tbH-MIϰ#N D6ÕBr{T?Юeezʔa3\`y] 8cHkľAùǦ؍PFpeԾ ?<ܯjzSp)wXjfMF]X`'>.}eRbKV^ߞZ,˭!J:"*.S<ߜmlAձ(htaH.1k 8C/В"f|` K45Ac,{ŕ"GDD%G!KiԞO8QCˋc7Q}3_nZ v/=A)P`F($pJ9CRZZ721S '#a0rz+ " IDAC V:S22L <n`zRҏק`-l3@~- ZD/Q0|9eK(j?uO=c7k:Nɱ-^ v1)IqĘ"pĜIj $ QKCJo⽠*Βc~x֗9'4gyteۇGavW}\6sU۬|[K:75G|S~}?nA d5Ƀ%F ˛6nӶێ7P w,, `XimH}JGҏ07""+"%|Z%a%= I֎.q?``;~whhQ;440+,Wg,N~cǣȟ~`MFi_`yD,߱DTa? ˣ?g|Vj6~e8v]?nOJ%#O8c()m <]JV}ۺOXSʏ !X,Pdz0p vJt͖G/mb|E nJHUn~!KxT+c7zpxv&8ց 2Mnv,7Si F+RcYÖ"'p[$/V}ϴOg\_8Vțp vTyƊi܃;% 05uA<Sr-fAzVOgXk^5p[ ׆R M:0AȄJ'i"ɤH~Zf{p`NY}cU/.}|nZXWHo DLQL$;rߺ+ ~ 9eցjVZhΠ6 '(rXz2-ͳsɤvՓk0pu/a 3PAc/Iw҆H?7 dI_ m%7+="(U)g0P*Vl2ۨ9cP&x<lزU%NE3p q4g{4ݴm2)}UpE6i^̣%mXqwa;c3HYw] tХN<,gYQ䩨ͨfÐXN0z0<Ǟ$jXڀ)k)ߥ e$ZNh 41͋)JY\V[Ѝh" aQI !'K Gj1yaO<]Y)TXhҭ;9̡ Ͳ =AFq2JN@kP d5CFVW@Yأ>тamyKs`Ov#ZR۵#29I<Ζ݄*ǩ|T{k)4/幂ƬPI6=(l@廄/֢n!a덟Jcݹ|GpR;6Q(и3 YO쀊qCX5VC!/t l܏H @&mi&,c|G)- !ܟ Yun9̐hfen]%SD_KW¦fsmhV= |jUn0ހ=т0a(͛YNZ}MW`F.lx&3\`y]%ic Dgxg1gN\{Ʃd.[m*1=3*n/ v}]{"Y 6uP-1TX^HkY؊~5Y#ΙX jOsҵHCw0NVu wLX '*/0Y {JSڑQ7 _ bG3 >f(öd1vEkҨ(:qLaaɗ濻n{IjXR{+Int~"%S~`= ֓D+Oo/&^c7cqĝf}9Skz7VObo{2Mռy콪B3\%<#"Ik/*R*Tudpx24U i3cF! ?oҥ dqlv[@`' l}CLVC^J@i.`076MI {XMu1#$IIz$f&ER- b HIMW&ԿݭY~Ly}ؾBq;_d1b c<7ۿ'O(0 ^\W+z Eγw*@Ec욂id3}Hq3>Mb^M_vj C?NiMY^"OF>M_ %sƳC]{";֫q[zYs }kRWRHDoAlD Y2~,c!G6{s;I~{gjY[Pф3\`ys-װ̇'ࠛ .#}>2l㷶 ;FiL.f7谡~GUyfFUh*7,uo5w+9]ytuKfafq(0VSao&$BmA gFNiK_͏R8' 8wAyP@P ܇^9-"TF^.)T&H<#mՏXZZcOcYꃍ]z,+c\)I h: 8b2#=)ҍ[lI*{nw3&.i ,o /E" X@_W[ ֨|d g)+5zIk.|[<-hݭY X2 QXaiEӡԠkk*&0GrڳlO^O>KnN2;s/\ dQ4vC.>eƂbS( gaCzѤ O6]7LΣ-.z/.53\~z; $|}N}TY"]fK˘ WbS?\2f-_!nqh-緐uɁb?BS>Z 7%J-#-t6'h\ؖ‡ F B6Z(Thqu1SPfvfz.o !F!(A{@.IM׏ce1GaNU.V]`6EtrwXls_"m;<# g /3s2ם V%=Ok?d,|ZmCţ5TH"L+Ry&YK%!X2lEn8v] K(EەnE$vay AՔG3)f_@jMSlFQ7uI_`yhL)/۔RL!t>Bijs_̅ly f 7 cN'VYQ3U7ILKh_?AWkxSIhP7ϙmIK Nѯ\ Xr_$ gwy onm$PBi!M+0]"< Mz]Fd%~ v^dKRo YMIjH!Mu 3Z{->e'侳ߚiޮݚ^H!_@ӯ(8{c7#]+Zc.}z˴:Mk #8cJE'S*>pKxKj*]6ͮq6j? zP]07}ͪjGmVm?0&/Z\肂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 )Y릕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ďe=.dSHnԕQ7uIvcW{y.+/x/1sj<[$$҈ꖤة[*tuQC}*?M>5 iOnߗV nS%R cu\c:8;|>bT4Ԡci%Q@ D㸌:zkAfC:IB2,@}L5 `ܭ& DM(5Y^C-gVe(j-_d;~p?E@u\%*+K%P9J `X?_?=zqIz0vSZAW;Lp_פ_\n̈<~*ߚj9(u, e8eެ+߻-_C?_YoϭČ8").] ,G-IV$N^S)ŮJG|b }oHh2X<R.VO>Sس;$yӐ_ r|! 9I g򦸇"[B c]|Q,L~#(z }is3O=>z[Kj&-c,.~FpQ>\L&DUDىRf!:9Ql7O Z/Y 3=kV)Or!%W--uxGZEA{֋e\VEAFMDE+;G$`kKT%u]V{ߒތ,n>>MQ8M|"Phe{90ԛpetI $R8JJG˚Θe͔ vyxQgnaxc*`W_廉Z`TX J*gI 'jؕfX5*Z QB[اnhρIU|{=D/gQ:$ $5W`chK97 T v.V] ~w09vfrK<)ñGZBrPD5Gw n-e)վ(1mȆHK_z멏ݭYiObuӝw굟ae- A&wߔMű5k_qF-Vfg }^31OZ)HK3Ab'ZmuXٰHmCdJE:g}!|sSfAk 6X Pwg+aw-|6³QBG5X>L* sE1kCqР37$a[6vyTr!0d^?4LVp1A4q]ŒǸxJPnRK̇U⧁9f'U Opz{#ƀ@R$|IM!nGGT8TF g2SkЊ[huzKH#pӁ\_z":[࢓H=wkc6O/úg])AMJzbEf@BĊrͿoAA*dZaܔ0OC @@0}YT>tSȣê ּF y=v^5盵Sn{^FA\H2.0M fJtq_EI#QLB@vZ. Hk0lh%\fD/SNKH̷~PlQp Cֆ7|D#QiPBCIH*Mja\2d$Xh_WiT Eޮ8vfOb Yyجjre"qM7 QQ8% o= e^Gy.o퍓7 ÅGwK n]7k]`- g8`(SX"0Fi_`7U>߯Ӻاnwh!9(^Np1lmV:&BDBm" meVK4*HT2-TH6sXjv<@wR5IeDڝ RoE+~]/8YY`i,o)d= EFgkpT68}+~(u;S4ضt[]]3 ZDG ;6O d9yFv2,@{ K}'m8Ư9n^>W}`M s_+]cVo͘%YT-#=0;~LVhAc:a hD8dm/֡*zCV%V|+5)^WJ6xDm>0U6!NAgJ&"a67EMv0HiX:(4ЋzФjB(a`\L<\͆Uټ 's=,݇ Oh}F5i]"<tGήwaCKK/~! i=T:A3&nӹ; q|2nGT!%6~(-mby&]F5$?MW[j{7oo |I1΃ vLPm,_d'i) [h*]s"I4<`M m;wؚ-H0/LRIqis\^Z(%u.Va˂9ll3XB Û4`Rq4gmiFi_`Vc`.oɓxYNN+k˅*Y Q&av=/{ussc){ 7!^X8{σ}܇qw9c>E8e79-Q`R!ԱBB(}(U rCif|bPj_X"uϘfVW:tq++z;{ RBei<$ 5vyp"?V!M]{Jbön dݹG/Y꣏',KE%x?]*KawCmq 1eS P5FX@}FX(HP Ȓt?F9#B T4dvD2%EM#} w9(`4+'D]rB$a(Usj[:~L\)PA@sqc{InX BPCwNt3Xd߂x%ݣI"IO14̑D'X r%&H!Ġa `H#N~xv1\k} H郧͂ )a3j-Ge q6`̞^}'5Р\G5P%ÄkooLr(7,D'}a >jIC\Cޱ6$k?_0C z@ ٪JT&KMqH5x~nUsO=R&7i9HbE0D LIV>H-neB+"i"a=#d:&OSb4Wq:x얥3OLj`8?4p5#gtEKRH\f e3(3!mžȵ#bZmp]nj [R 6Ҙ7O63r"u8>2fۂW&g_FƮ>GNK?i -[8t ?~Yo + < @>AN `+MsG&l''ax=V+4k,4$ԟ]/ 6(PjiZ,S54^o7C|6jh>I`H( 1DB ˝%â=2EDHN4,_D3Q fԼ,ICu]Q'ki˞*=v]N4p⤍_ x:Zzy;J<8ݞ%*g}T}-a)z5v2~5JʬaŸIDB?kL %)̮&p1" xQlj^BS cb\GTÆO6^Զ)8 I0DN6`m#:+i ϴD#vZm oZ5}<=}p1MmO\$#7A/N٬xjI> i0r v>\Fpٶغf AeSv:Htի#%z,(V~IL+:%{]v[H|i:] )FagY+9O-UKo-< ?-;yW%s b_[]pK)10!TbO".LU[tB1Y=#dRPD1H3aӷJOѨC(H]eTMclH:瞰8(AqZuܧս^5V8x^@nIzA@s)OoFb]Q>9 V9m ʷb:iҩnJ nw&h {L&WT̀ENJAq,{x@Ol{h!&t1: vi}O Q.gӸUK?BlG4ƒs: @=riPP (G~x5,b|R&CGB(n0-K["us0%_=ٕ[e4>K,1NjFYpJdN03ay*KnxmfJH Iym(!ۺ|`|!٫#TU{J)lCQinF#.(|Zc5UM))ZuL,r8̇GL'bSծ I)w|>%"UBBއO"INKl9V( .%V,&~=Q7%M~ ]6p'ï#_qC(Q1 gp[3Kq((Pw YXZ8Z.oN o0x_S 3׽O)~%1K6țf3\~;y{4$Vrտ)z~rD Xj%"ƣf~`Gi۾ps}/߷Ha1Szo`n2!7,wC:mu?`Zf ZӼ5 /'.Fi'*/om}:\vLRwQU@En+̰^(%H[CH$Pވtt%8,Kmc_#R1m^c$A9&&s F]tkySR7_*-vvG<ۨFoڂ6cr1:~4:qNcxsBX|RՐub5O-UY~f0}rLjio;z^UDhEl;CRX-c`0@6#~ \ACZUQd밿j{| jYo>vRDzP5ػ-Ӿ{X}ߪv7ہ4`.dZX㈉1|YS~% x#0 rՅ{o6͉Tg&5f!Q.h q  Z} ~巂倨ScIʅR!$_fXOǙ>gNY}E_bun35(`fzqSS穊c7EDYe;j8[UڗTǨdXo94GJPa$n0KC0cp_0J`0Ihfғ2a|caWlg@JIY][y Z*h] Lƞ|/p4aY#L0J30jaB1kktZ#;yJ73Æˇ5 [gCڨZW#Y3ܷ- u\H 2# :d*@oh}22.egT,Pzj/)6uSCa=Je>@Gk܎@>$%HT-ux[a&kK釽.J^QP!B#cIHI~vlSڌa2,7fF+kf^* gbEhu`'bxZK8&_ ƃŢ7_W [9Z,cPQd†+IM04? IZ$l^i^Wkxsvp[gɰ(i o~Mr:<7$%}%c٦G!FڝbtyoEiEz>01WcvFOL,pUT,DU Ut/<0X2I.]_籦 -'%Z˛V M(q5^n6GVVf G|cv},gc*ﱻ5{ǩ l1Ǫ!NDJ/*ɋZ¡΃4SU:`J"VcV4)4X?设2ҩc+a$yGoÎlgxGcf.ʿn mҚ>,x=)I+P.E\J\yqS:26nvcpm`67=)ư3y2gM8m?AxB_wS Ke,LH$^N4!zG % < tW(Ri~hEX}%J_LNaNt9؇QxN1~}ie 낃DlKc78E1g:>ʯ.s% [ן]Mz}it >/~:2z~t#5қm&P,jYiݽ6WKBa%)âHZ~'e6R-#m%ԪhKVfuɠ'RIAwHӅdϮܧр!}-M==bE4pc? =>➤D=27o\ʚL2O'‰rv p-w(c _G `~`͹F=_?2HV D(- ooiImRL KKZo1'Sy?Kc4H|^&\`xBx}9J>R!o#D*GRv0inR%!/#0[ +<7#kH*Yc&qd9$l( JqJ hZ­7q#3\`ySRg_$9sx#M!`zП[Uv X_|`qyŕeyG`вc_sOYAFi_`ySȀ-Z!tm!DF4- 6 6xBԆ<.G @tG#C`.]uMF`ÖD)af" %6HKV%R#PE@5ggD&*῟a':n0]Ar'4H&&9#K`W?#3\`yJ'-Vcwk~O2ڡ8vFُcj:MRX.2'Y}|%JڅZ%ĴĬ!eJPak_; ՠ!$ r[A0 X VK!;oWѠhoůcwm2{x2u~o V."K!ߚ-_~oێT齭%Xi]k,l{ñya%k@ @^>dT6^%/X2\=Lnޭ^}?&it!i*-!ձQLypN1t^$iNs6ȖQvhBMՠp봺9a *aXhv2S Yާ| N  {Zm6lAlR7߉V^I3\ U7HM7eIB`ADװͣ?g%0%v֘]u`y vyn;T)Fk'NcƮc-ↇt[yx"f|MH#̕*]G5iBOQG5£ )~Eg^M}n͞{>ťZ;4pZDCB( j}f6ȘDbdLF([!@?W$:뗤iJ_͔nom7I !s~C af͜=}csqc7$6jNk= Vyaߘgߩc7إa=V;;4~c{ iNo%+=;+U&VR[QXR]` ~ .MVٷ6腊MKR_$,E|Fcnӂ4??IW.Q 5lĴ&DTu*݈(\ .Sڮ- @tmPvu.]oVF_~hG53,ycW.&5b^E)` u嬯F`Nj!>0RNpXr~De}6ꈥ !cv;^16'( ꬬzNMs5#^D xI[1_Xg?#Z}l{IX~BK0P1 뗼qmjyRxN73ǼfG*zZR2LRhU6ߓs2SxoHYߠDZh\gYF8y<ʽڭ l5έZ~JmfHMj%8Rua(sx(<[kN¿Q}=Jop8v^'7)q8vfm ^X_$-_*+SirՖ:}[ YsM@sLMQ W! LdxQ,Lx{`[ nV(vPrnG"ő~h_RGQrn՛#! ;kܳKl k&Q칽i$ :K$:"~Pv6?4-GSi\͹ QךYct5ٺ6O7 eN@]ox v{ v.ݛP h6%W\v$7z.d|$O##͵ ( *+B:T.K|߶%maب̈́+ұTy;D)w^UAxx }cwkootW 4JN4CEYZjMnE[s>EiQPlݷ1m(W'n;[l(+ґ¼R@`!.~o&d9hQEbF{a54NP_R"F@XU:LCr /*7lXuXmyڣKMR09\ȨLF8å[ ל)Q)6nЅ[7H I_(ֲZ+ZFԆHEV%G&݉;=tUMRa5T^14AfFmE8vݳ-`Lz秩 ,GbQBo$`~W=:<0rͿ)A/i9X! h;b:1°m/ ϝ@neRC90<̿qQ=bdUSkֵ)u }1(ocƫ6 x7+TpO;显 4z6jfU(h's<<+'NR4S1v0ev9z18#'} BOۤWwN՞M{mf8"+.D, j@Z1a k9uS$׍Y2D!5Z\3qL6 e=an URvakDRFB*|p G0@2Y!ýTy{Lm>3tؗiѧ5v/q 664l(h,ߙc/q̤*BO$y<t1SFL[`Ecwk֑혜c>LrO^HbƍL&s\W ,枫rMWmgni 0;{H ?@?u1L2LsC~?O#&=F4(fĶ 8sc-/0^Ky!)S@G$d_TXn4}dI]4$e7aO/H ] !*4/-k fi7pɬ}7p(ű\cȀձⶮE$!س!y ZA"v֪)& Bş>ş>}T v lbc+Rs/_Sn7扴c7ر ]k%g3rű{mk8ZCV ~:qa|k!3nk֪^|5 [F%wX֘Y訶f9}<+^Ro.4-k0;u㩺8T()ӟ] %Jq ",T)Mq԰Ȯgkކ5u][[;VhPH+Dtɀ4KBUb OǞWX/|{V8Ukw#(CRqB8Y|^696ՖNJZ!2jS_TX[܂<$}K֚EѕL"+u*TkǴST<q!?Hp8X-0{ {-h 5AP3D"9SrfD1 7W{r+a6 D_8MGL(R<ڥڱ1q* cqF#b`K݋"B 81>$-f HHUCy/B{aς?YǺ|2 6gv",)$H}E|7:}2W-Q$K0\Buw ?yd~lNA"c7V~+mYqaRޙ`m_`<[n;-גȇ%#R#op1S\eVndD[|(}`cV=E?\$G/aLLĵdž9hѷŁ6a<(nGcXk š}d׀B@fYԗP2پxL1ȳyۨ7=rÐ@au 9@ 6AHU3u/Mg)"9{nxӸ^s;䙄9m i oʗv7HrJ4%B-ӴQ4ΛB%) gns0%bϡ4R LdRN >(Yo9煮5#_"7 4r#B[ITCMR,)dL2 KGVbJە f=$}tH/s d1& ZCHB¯wSb-3,S{-r^:]31y3 `j@,罹:KWW[45-8?7KnsߧSM{+V[3A-\[[mtpc]4+Ю '؇ +,`wz"D"e.~5dz5>fd: ,0 ji9Ly&4G [v7)xmT-igkbǙnbL4&ͱ5 8v'>)țgD) Ǣ(ѝ7p%1\勦۷w't[x7MǹgST} f+ê7|z5j#-TykV jy.1KkSU5D%Q ;`cT{:E2&ei*BAy#N6'߅uXouK @|,VƁ:U4zffee^[5|NjJ[n{g򧪷Թvs os>봞l3j /^r,$u }ct>zJo|Ta ,o˹:EΊ*,ºzd~1n֛LGg? ַcz0JKos=JiO˲y$IA{;lըW渖?52_bOӃp뛣|Jc_S5t=1Yj]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~Ow6ٙ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񍢔liP &9Fi gP(EL1ؘ@i'BLR IR'\3¡9v]~kk PfY>+aI ^iIϱ2/QAJ1q!ȶ+H Zq'(@^N;7rC#0bBd9t ,^3,XW{nG-mR^)IC4eڜ 7c͙z><` ?t&K/ \6NJ^$M-ta"j _USFEd-+`:Zc3љ5\.}B6mIF$&5Eh,BS@@ʌDnn1)7_D7bʲ<1F0H$ȑdp&˼m!O=!UWqR~2P# /5lD~ N"7g I+^shd !=%ٌ3$uBcaℹEKARN^ ݂Yjjig3|^o2=y|aP;*X}+Wp4@6aRQfSl uq˺,>jMtOFee=FZ921nmX v?l;",K$묆pTjvZF`,CHJ)|1krq@&m2K2FzTFmQTڗwZ!~gU'tT`,7X|gӽ%n:,i_8w\B3g 3JN?zKpX!\eKl)Rh+t/~haMQ㘮8ZM)2C7X}7c{zS͋[BQwj)<& ?gD彗оk f; ֨F@_x~A)^G"'` aqyŇlQQfgXk|:wQ>ź>:a@;!D6|xz8D%ļ z<݆6IĄ$e,MF5)JJ$ǣ3&R%%g_-@/zp1֗XKUNN3wYtt[?c]_#l7ђm5abd"x\12rKb% /#Dje˙5?:z~/W [D|C=8=tFG lƨ>gY_k Ҫv SQ?"(=-3ߊLq|=93tcrs v 79?o˚ 8vfo^R8vρ@ d`LO}*lÖr\.-ECp-5GKO@ m%vhqg([S9v]<]g.{'?b4-DX 8k(b(kx0 ѻJavSEA p''>JE0Dw;67vy%.i1~ͱrFH&q~5A0@g3"hX@/[xRw V6 B[-煙1Wi.4yIgD7L [+u}/Iji$.{Y,cwkh a`"z""XAO s= /ePn L~ibRv-4X~lGFvr H1Ę#F"s HHUa|mœ/dTrҘ)O7֮%rTm%WPߏu=xT l_1D($1<ϜIyhָZ#;Xj }\0'mӼvcZ5s !fnuD8AKet 6p r- l檺UHF;Ͼ2JbΚq{ S~OS>E$M0[=8B&x*[gȂ!|;nafBQʱwa f3":fOJq2H0:K]El΄uٜOPVFq)0\l K؂3E$ K9L;r),Aޢ'ymJl0>{ڈ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\;_ @`Y;0DYExcފ$w̋Y(y*SJo4^g]Z#$~EXr퍅6?oudAofKh4$,_q,%.0 Tx !"V X!kcB!bnmq~|*֚}?>u=xP[ϩz &;K&@5: x`UXkiw=*2 rHR@_ˬYe%Js4jjX0PMJCӤ Q iMY!gƕsTxcwq!VataO'e'v8̩Ckx5kK 08Ȁ^AEʴBilnH枖6~1YA4q+;ڱoQ90- c8(M\L𣌮T%U"4F:\:5qI3bٶؿHeu|+cŶK>)%1KI4knm 0Чt0 Lqsh͉~;2標 5t?o}et3Px@yoqsJQYZԬlbBXFRa=6 6~VmK3C:M(3)GҤ*Mtut#Kal2"rֶ= -Y huR2z_*9ScF"0#6Fh Ե-縵gDG7֖}GSy7t1Wn7(i vY 2Gd>m1 FAOն^["j3 p.KN#twW |5-s\ޏYukn~ f|Ɔ;y b;%O+jmͫe>Akʛ0_ZyyZ5y%tDs4qv/h;>0F&}Q-ּp%I:fea#CWeLتL)@M@ ۦ=nʤ tMjh<߲^_݄3bqr%$Ӿ,a<0Cey|j KƊn7QY SJv44z)JwɈh3IE\E;OwsBg:QA%9JC u>vȬtw%&c ΚIZIA,m !c*GKBT'*D"1$bґ`DxVesl4BhmJQZ%6Cf*p09́rV&BM%OL$ %&GʦzC2n̊~XUO"7qJҾ~|euWR%+dC{h,~°Xܗg߁Ca3ưj'x.-OnQ,'?k}IO( @OT,hG $;[HV~Yc9]%kN:,̻81Dl1#E b~{t<[0 RlB &Ҡ02/ &Bu򅵅g~D+QVV%-9( iG$G.Q2e}F'6N&iљP1lp]+Ъ"jFTtfwWC>10v{E?Zxl)L^Ks_D d&0ЍH JgUa问OxAz4FAkG!{.`jQ A9  Tѹ~-7L[\Ӟk'KcgOXG3?cЯR))4JJ*LZEO{wyg_-f{` eKzB A?+d`t1DTwP7jؔ"|H)UtN)kR֓~4ĊSXw)atZbx?cmS%)ColNCkiyBLdM?9&?i_NDpUazeO\Z6eǓ?܃UCfTfdZ[e%lPNkۂ;+ߵTؠ T?(alZD!dYT$IRO5q\`d0RcMi D-lJd3`̚[3݀wR ȆhSgտ,gMַ%dr{be0ZYǦK%c%FQ~>G@5 DnXx)Z"/Q#Kjuk>m":nnx^"W#`aty=t,;]yJmw6&K]  Jܾ$=^UXlan |(vxẼx >7IP*a0ҥRmkp%.k.:J IhAܾLq4ocd D0O,6^GO?>!>@g@' ~g٫X$4%PsC/EóJ:K19hSG t?C:ayًDm)ü>B,d.P| oǦIrfޯpT)SKJDגMat( 'lWsx)rb @>Za}ZuslH]"Gi4$Lq2(%)\$qɭ[ cSۈ`s=SSQ\slѯ9z^''Xeq_v3%pvB?k%|4-HZ ;KQE E/9@Y0-wmUh¶YWAeKvkd24uۻGT7C \%"x8UE@.M ~h߄F:O缋4jAA@8.M:!햹gۜLbhI> 7!PcඔQ4m0:u]rN,{hCC`aF'Ն~>_ɖREGvBٝR+xKfIfaong/0'ă謭'D9M{7nY\;k|Tz;Ov*0S6))t8\ԘWlhL`i͝00-5L/™?ƪqkqYDaיimyp~@-:`7ڷx)Y=jH,UZ\MnڰS ݌Qx5ŁP8T*aJlJte hL4r`Qcu$i W;fS*MrNVG"ztHRϵw@{\f^0%l`@VҠo@᩼[jPn%n۝m9FAuʔl)&\gF@b*T#J "&9 YwOODZ_], %2ggbY>K&#(Cs6%Z%hҡ:a5cxW*K-m)E͎,k (2}ITOqY4 GZ}@f  k@pCR e*_"oFJLz/hؘR ^0!8u*þVSM/I[g):ce8 *eXB/YhARQZUů% %,$rZ9x|{];_\_u qG/Cw Upёݷ|w(u`NUL r@ggJQ&2+CJdXB/gqsg!B3/1-"}J Dv *SFCB*7).2f/Z+fEd:~K J~~)jE̤y,(jh4 OW=BA +nϴi[BF@freGV԰^n/m9<7DŽrJEi߮%j=B-)ԮXXLk#5kMO^nS|>ω |z/=z| G NPqJ$D^y`@b W0|aD/Vn p'j:=ON#;6C[HWv<[6]´F#Q/þ'hA֔M _h;U l (Pi-ku)s.a8c2Re!uP*a'A'2]ui*L{n YnIGlيirt@`2,erel U,nORTA;4=9+h^d@  k/FDTܶ8k\C6hksge,,"`AB7Kɘ0}:n6n]as,c\&I$7DDKUI+7$ JB!&i*gpB-FVC][ͯyvBjptB/XA#Xqz%ʂpzC7Lb@h7$ j6 v}d" >FI7X:~hЀԡqU.Zrr0ntOW67_:N SC')i -`BjQ1a *ҩ- ._Ȭf!XR?ɿIaMb0/=a"&"E+ R, ]r ư#*Ue*X½iuwx ҅ۘ[+EC[g0&b‡xB|tјؚ+'"r /lMPٍ E&{k'Kcc]ʳ~/Eͦ"JsjT21^Xt eK"3,J$i\IE#?{v浏%̈́-vKa~~)}7ɖnpӓAD V$X tp[u3m?ʎ0~gX_)3Yn{t<[ie#m_ّcj_F"Y0sM*NH.ud,Z\!"'jRh7WRCJ~7p/W«s67yQ`fU44M~iS 0I*gL]~ScdL_"˲Kz]X=T^7&vB?kesD ޻u}4Y"r+iHUYD{4U=> Bd `G%5%Ji="Ǩf5?ˌ Hb4l 1 \z"yVvj3jۦ=qK"M{EtSa|Zx6%-)0k Ljz ^-9Aކ<܎O6-!N8ЏcT&U)"OطCmWn4dmnI%lI´v䟧b9>Җ|ˢFAO^sh %_ 1Mq/)@HEPxc_gk.[5^+0kGKh?HuGk9XuUa۟KgI˯bO3 }:w AӺtIZ聯,!ih$~͇͋' C}ؒ.UXU][] jҕ_;PnfߪKM#3Bȷxd[.8cyYfxk)f1ف3|)!i7?u~wQĔlLכ^3u~}@#Hƥsȸo~0"B/cqlRe:H H32F<@p; eupd7Vh.1joBp?؇6Ö[O/X9ڎ0:ߑZ>تnȌyʁ@Gˍ!Z&0pc ms` }:)˰ h/chyO>mӷE梭x;,Դ @ScK6[$*KIM "8_:M^n1U[v,=O1O6D;qIX`kէw[PKc=Vi(k[Ҡe+ZX!y?:,r-+"tYQT4(afץL^dNکJ AG0ޥŭNf/T'j~#qCDT=01j'k,e̊n :~s~ ]ƹ\(X3\7% FrUtU_A@G&߷7_mQ |NHGhI%JʐDG:Nn}~S%/JCRdWVn#8ͩjmYix{n'`)EEjW$ukJK?+\7<4w2Fwe>s (1x8sPiy;ږΔ .C! 93=LcK RB@hl'-VZ!ӵ) ܻJ(Xo`~v/.mri_eE?XjBJsdVKYϓkO.SHE-i(H,᭏ye8m:!ݲ`ZC&fu+5،Uu!dNJ1fA&C2nSmlm4/,YNr|Q-#㰎C,}SL P(Am*XPjElU4Vm,;x??Xq[Y:Ilm<_R'EoTk5o CFta*GY!%PXd2g/ɳKDF\B0(%x-^/PX]-8)P̩V*4 \e_fgz{ܛyJ澻-| ?F;/Hh6Ȭ!x Sl"a{l;NֱsߜC,Det{,'0{l='m»`؈ul87ml+;Vh>l| S Xhr~[ؙ勺,ђ4s=NK_$Ndi$ƫ퍗QqWЩmV-eQѳaYLd7kLyTEpqܷqCU̦` `@HM6Hrʨ)!$_{ pc!]BNH ~ե'I d # vnjM}5fYg.:h/vBLb:ROR,rTZBދv,|CA̸tHlRthF]>vB;|ar>$*ݫ70h-*a b#G0 h<>JN0h07KIdJ=+Ӕ/hHbL鐙~g!%UATu"U#n߁kLy5qCA%Zf"΢B@2+>Tltք֭0N}X:l | n/+fT:,(ѱ @a߼T,ZB.y]S%c`QWs,F0.c"/^*kf'UmxyD"y+W)ZCA:̲!vn_yv^ !v!IvQUM9=>U퉃fr@15E"3`pAq$#lsC$QH,QCcװ)=4ekLT8a S2PR~|U# 6-i];fy^GE? @> V.@w$\֌Q #0)m,50 ^%7n?r0' )UP k ̧f8Ȱͫ;SB ZR8.E R'HFSl y4ۖQC(hM.j+6ޱ mxyKO򧊧'OYBX2Eބ&v#~72Ou )kfQȐX_ cXd!ò8Ӵl\SWN"b`sQ휣Ӊ|-s%pZQDWt;km{NLvj煮1HL<18lgtfH]^)Zprۈ]ٲ)wPYԮ25m\Q"߽2֨  Lb E{#=p7npZeIG}6vRYr9b< 4/:Qd96Z [cy/aҠPؑClgow\:j[HQUA1 Tu< B}Owtp7+ v,jIV+c_f]*jT js-Bl vqGNsxPEHV _F2~F`@*nC)35K>RнDm=x1Xy([ ",d-`TجS ʂ2ImJ\%%\~⠒< 4-ڶk1ƒ(M,sMIXc1SSa>,pnjqFx]\5xz% 72ǝAY`1d?:Y~5Xf} bP L(m1Zy#fab7BC8x,y&z%#qߖ5?`}VtZPdPYB)ܱY[r[MdX+ .SgK&bt“_QйŒFHx@7Z9ƞ(g$7`4f(yZd`Ѝ}i{C, Lfj,$ r݄\w`eSCkǟFIJ()9P@!;$WFWg *ꢚT_E%FN,b\7{C`WwxAI5<"=>Ek Qm_|n$C+mhl"cCu*+SOTu=OOj[h`@*QK̃7L: ~Bt˜]M[:a2 8ө@X 0F lTA?$iH+3DiJ5/0 av3+StԂ7!S<|{—>I ^Ql FKs_A C- X:6C,uj`ײK.jvt{tZ-ߨ$*ӎCFHO%Bό #?%!a xs .,* I ^ #MeuvvM$ϵdsulػQyHڶ 1Vs8MA F9U(FWp6ܰPVy~uRrgIFy1z1_TԐ3XVEӌh,4a=#5mʸ6vŖkR~sܹd'c( !V*% ?c۶hlmb ޤTjWnцKZ%HLlPLI}%q6}ҶVm_R@ ͠ 6&ܼX0Gd%Z]>؎!?0?ܯ4~vR<ZX'ZT\g i8 ISLJmHL&AOe`QC*tg2 ^{Ybm)Lh)=+ܫ$J( $FUH@ju}vryUM/=KCw*@n2RlkB0ũ)weE|"ՖӍԅX2WFr?eۦC֔5гP^4$v㌞D WC[$Yc/4s:mAY d ;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 dXutpYNmvuH[_R Vhp3e؉^NSHZ A@Eb&+B|msAC Vlw`Eё|]H]M,]Nz-9v$p`ۼEթ= X=9dՏ|"ίCԲ=yz< .ŀ5u-[^bc<z}wk'$OTBm51am.tC+Z_β[06Oqp>}ᆑm~2f7[msG~qʑo+uI>YC)5)<fUQzH7$ MV ߛ&.e ܁U X=>, ưu_"o>F\-ZBsW"PRGQ0먨-"yTvmO?:8ҕ8#Nzb>A%dEFj-k<Ƣ#ʸj;]s~qk4}4N>ͤMdi;3r.׵Lxx/];_4_/¬n/׵UPFmz ߽_[Ѿ k'v58E:n}gQWG$J75YJ\~L")ӋC(Ӵ!>n3s;0v0yѺ'NnE!tM5]cQusɣW|TU nbOD1$1q'' n"R.2nK'ɼ2x:FJuJLqR+ bB2K oIJ\ujuڵy~}s@zcÍLد.Xs|= q ٖ x];_2GJ)QBi 2f -4`5jZ v0MC l&~"$U9i*H~u waeX*2t)9h$$1FTH 0,-qҐUK2MzL V>H4|zHQ^7YZՓ` E * 7 )(vSseu%֎h0ðw1`ػq+lCtenwj4_!Wbܶ6PVfd/#UmsV[$4Da1($'{oWW\; b>K7C7yn-n, `t*Bj$* #!-0}?` ]vSfg-:YQ ޫ"Sz %fXMkXco] \{2ϫO'{W⤺K++k+2W%o!n6Ĵz"b@2K25,~!)i\Q Bt9U[K'-iFۥA|4}^WBC-"%iSwmÄ/0I_{ثew8~/cғu ) &'a✐dV+of/L6ㄱ-QU0plZ-f}QO%+LX 1dxE޲w)}CѦav] <,t>T"E?|Isbmꬕ/'`* 2W+ 7!dH)[I ѐ*6XW oݷ./uHT/a` DJ)kp_'6DX 8FJG1Si]c*x)qۗZa[i ٧neN x+ؔ%ó hE+TAoeϝRV'Nig-:DqأbDٛ+ir;sM{Q|b*䲡eϞt٪ۣG/ G&q8n7l.*CrqY@2vRO%c~x/N ,,q> kKJMEF )hXVa>[*DHC\T"La2D'lR>t@G"M{Sf Ð|z}7mR+#X$1n)XgF%ȼtpHTpb##j߁m,=سiJ$~y C[,[Π@eHIRh`NX@@ʾӸk!0ap٪r0:rip56VnĴDC;ع&Y/ mqb0>4T\%Z h'uo_׵D7?G/1̯2QI}C{g@5&Mv ;APh/~IQ+Vc+.ԮcgneZ:i:rӦ?O\ڈ?@L3D!] Bc\ͯS+[%iwx=Ay eQ馡Z# B2G[^<(1wZOvMeSrI*+.{r P IH?hxK".2Y/0*)MOVus^z&kծ]2F^ӋkY ᩂ4@OI$D6Y1N$2)~.ԅn},\, m zފ',Agij@BfR=*֪"3!T3 JRMdc>y5ANw} i lF\lи4nm1]T0#Kz<[mmҶ&rN4.+|q oCU7 ` c:AL !E:p`0?@n)!5J;ϑP$Z^pIk^ nJ3WiF700j VMfClvX^pyW0>>Bh$ˎU//9p=~KS8ϹCC+W~?_CW3atW3FhVB3v~dT\:$w \;noS]ZiPʾJVOJa+G*{(Z W>B5r1v fwLeB= @J+iAV`>n})C+UaPTLgĦy.(eEB+S7{Num[b$@k&8G,axUs]h؏Ce zD0O1cZHwG˰g'Szͅw*'V,"1f BNux<:-c٠X|J:@ HXSI~~cc!_FIS5iedHB$~0 Vn0*;hX0k:biLC#(w2FrٝʹNmV2df)FqsM0Ҋ&m Zzѯ1=քNR.-*s^C&-j_U  O]9}o_'R 2w Q;vC)eu6Q!.!.Cr.y!]ĝINZklX5Qk'rނvM';k`"6h/ڇ ㋬\*f@?wO _j3@QX m>7;vlR=pR p6: vC@ s,t&6=u~)4ͼ@Ʒ~8-nk >&]B܈K i!ӱX9LrmN}iӄ6owȃ\s>? B2GNb-["(%=yC0Xa{ҲhؽR !) jQ=H4%HW 1xfءep‚ؼp KHtk~Jj,Zfݶ! F Ƭ~<;#\S\*X\Tj_hN~M6̦ uNcdw1 cQ`tzT&at5ާ9E/iNȖԒ  9el\9 y??T0qً~BťbrtP)'S˺/cjG&Y>ΦD{9Vu$0}dmalF._A5cH] rf@Q{!  z$l@.,d"k6q$sk\;lݍ!Y1y|iWtS/ DLIL-gRP[Lp]"$z֨RiM5DJ^xC=#֠R`FX䧂t%1crxZ#0s3fʲJ; #I[v׵Vl\V]\;O(l8'^Wb 1Mf ~[:롈F<f1Y+CWSIU{6yCF69Q0FtQ?/k߁{~mdcB!~cJ/6ib[7Z2Füo.s izl";{]nOES]nYgˍ&//J唇R%Y2:Ha)#2ZT,Esrzi<)\j6pOcѾOH  ޼D^'vA$ _{Evhv 4})> [<VjBq~ۋA=yQ|WӼaddAg Ə$ ү&;)ȮP-5؅$ouo.fJ{ǯA1DU ([NJϐ"JqX2_?:QsӾ!boTY*kѳ{{#5+8Gf,(xk'Zua;/X߰[/ЫpA:RRX)wSLwjV9Eђ'E؎ldora$/U&HHMBSÛI֫ip_ݗ/KϝGVMH˷mScdZ-Hi_ M,7q#[8ˆAeJiΪT[)6[;`AP"oCA;H?0__)+[1viV' DXv~0.\C4A|Cx>9!ꉄYTKctEQujC4) ZA[JBetohoI} r*¶NZDB!G OX8DY"g#G"GA#cY-L(Ka`Ѫ |oGXj8ehuBFX=V=2!`\0:oVrT r1ӊUx}NM3Yv;8HzaYˊRL8-䳤{Z/,PU#[&]{59w7%} ҨL5Ǧ<ဗfT =X'|K^ƋGR( 25>UK~ŵ;ns+>vB?,c$jŋ|Lpn@Ղ `@q5"MȶceKuovB *y$V՘o[!ҥK@>3MJ|E_585zlXc;ydDSnNA۽go{:#l\ieZ2ZyMaBДôf~B+8Ej3D4"I}ò?u~iYϫ Ԕ"'Z1n>βs뷏ֲF];_\RnH.~$Ya"X"@1iӔ(;@ֺ=V/+fi$/X_Z'9 ۦxt k~td~*Uv+M=u%XԴm4Tf5 y5.v/!O :{haSO0CZJH1oaarn,.\&u.))&YC.l߲>4PA+UUz:~}!ƉUeHZʭA16e9gIv6YZsXzno˯UTz"F.)Pb~~x[QdwXc>v XsP #q_SbyI.-|^C@6{]Ci¹}e_gro"5g _m GöP)u·C-]8 *Tl⇚T_asұH));,H۬$bp>Fm ʽt\ _u !geK":4 &-x$b[GJcI$ER+ɣZŌR8%Qug=Z&KD]6A$ $18p}&ZeTk1{X~n*6akdC)D]>YF* >ԇ6Sw臭zԵوrR,z UKj0]+&0jUF \nkV(I:r>iLaib;l+hUMJ^$1?g}iдx{8Lk¤tpNm; |Jgި`Ǧ('YG[bIF'u1[)eaaf#ԄXjxz.RYDB6O~_ V>ڎE~w)$˖j$YQNff"k5=?7­Vgͮ9O5c{ϣhÿ _(;am 尵ŸOf!*J''*ɖ\?/Cгߟc:rA"aT?$ɖt"En-`>!z 4ea_ݳtl!.-l"jƋP`)qw{t>v:NpxLqi^-1BpkVwRK2] y. z&pmqm}|^7 J-=y@lP~&S 4͉J5Roӳs=x%k'1/xA|S6:I4y_9y3ɏk qtCio׶6ߣiL5 j٠%̆ڜ)yNSH(AH1~H8OИa`b/zV{^HMe$62ZgR8P9x4vT:8m~-Kwm4޺R |j:eZ&7.).Udy.1'0'Zed8csx k^&Vm0H1*Bzp4(0جB$$O$ IZUZcr-<%6zԟN8OHD4^9Fq|@>CO?'ޗNNԴNR?!59Csl?Yb];ߵ6vkf7ðjj=qnP͸we,l_l/;SrU/ORβ[m [Y)&욥u<_,f{|v~<\=x bPP9gu:D *7*o/ Eָ ҫի4(fQ֩PUYΉCh2izY4֐?>ǫ ٙl>;l_9!ٴt$6nG'F~mx_C7^mCRjSXr@tג'!6+j[zXD6CRzrKwS3Œߓj=q^'+k {ua!\'VWGmo =cK.-Aj~ SS7CfiSf{(9j5pnBTxC|Q5!];_Bi d_N-<2)ŵv_tXys+qލvpZ;'B݈rH~d7uTjh>!ңyJ-DuG)ܛkᅱqTzC+U5^ Ay1+QD4 k0ƾ{TFTKs_ͭ_羴J#B C('VQ-cbf5ZU*rYގ(X,<`qͽU*7~KL5LM@eBi3ix^Ķ,5܋ʨ̋G+ɢ)~ oYP ݈Z۟eڟPC~iz_-+fjM8 LiV/pH.E]/Bōh'U PPQ+X$:)D]e|T::6DF] FdQ\A(`'1ݿ~~Z` !~7MvB{Zy8xW}𥲪RJ>Ͽ\LpDVbUjnf2 R~t 791!~.zǷ _vi)_`v~sxL`55lGv7keLk乕RG+з#FQR5*{rөiJjHF!\ie /IamHGьHP%D0ϾbˆٳR %)ms4Y\MɧUY(>I"mRpF]b tΧeg\Yt8:]Ql{' yhkKRqɰ̋9!ڼU>{ i)C0/˱%OhlX d*HO{l<.T>>B NNFFW)KyvG\NPLj#+bV*;@MkÒ QHHOF_ڒ@N~k'K)R(2vBIЊRBJjg{ƵQ%˚E^n bdI˥$,Gx^ţSA JЬ լ5Xk`j 2'E]H6px^Y9j*kgމʆ;FWDƅ%ZƾkS; s"UY ι*Qk|-1W=ɘ_tr :8^AŤ2ef!0*+.>xP41lm2MX8T/zz\O%bXO,2ɆX is0ϩS&uݺ\'~Ë1,e+әYÓJ}x\UnDj=RWhuR2O- 3ڄ}dpJh-Z4EF⼸=ЏWZq"2:?t(QPi1ֲ\.4HWDâA"48~r.-|Vif<`#0<19ԄHBDyA6(fHjx_תV,x&5G4ΌD%n\ld+dMG~Ql(I(=.[aqǛئmcrb*ɍF \aM@XAHpH@KYHؠbD tLA g℟vM}rp^[%p{vdNrD|($O Ƥ@ΰvqsE j`4zbc\ÉJBm(d}%NEiĪ1J[Hv0?η 5 N84oGBzaĉЏ-vWp찭̐Ɯ0f)9lO L+&Cq$Z`ɕZ~,4AZP ΑP5 Q3]k䳑8iμpz T`eK ;e@H\R)FDoBatZ/k/>p՜ **%ż7)x19$tFT-$[PVOk("}–M⥨`U^-0LӲmt֨oRH$Ό#!UOU&8%qFe>8]d;Ly~V\e%Zht2+ef^TJ(lMe7yM۶>f~CmUq3\-)H?0[3^zmo+kg[cŸީT֊0>-vʠ\ܟik&ED ۃ2~NOASA|@IIu1MWr!B[Q/ Wِh!u9;཈;WgDzgXl|&eg'55H^ͬ;F$DU,"`(tE";>0]~,N,Yvlc-7C V0Aat m8#rn@Ǖ@<`ENhM) E7MVȞl40?:5F?Qa)6B(ܚ ZD#V Y.-bvB?݋4hK_B)<Xז 'vK }ڻ4yu^0cfGإ=\}cEw~h=s{U$5E0YF/ŰJd/ImFmcTa9oBÁ_j/Rܨawu3ba{25#uvnᭅ=om*[ܲIt1,ܯcZ1+J(p(cӢD-h wą4%LS*lShv'1MRL'$ ^ ɞ?Y::S}'"jLOd5d̸l\>RVZC+7As=}}ߛ.ZؿhX;Ldq.`;_k>d3=y6b7>>q߃ Ay&?jhi 3Ï0*K)CK?§zTIT.Q.^Z)r!ޝ~ta B >Ҿ039V3i=PD `/ yJ~S+ZCBi3y^^NUdږHŘ>&p Z╲'(be$qIv Y+p54]SETzZZ^`'BX) ??ADԲ䚤,FuaR9H"'`a"G̹y() 7; \ī2*eg[4o^rj%l-Nju&ѡxtBehiNoTN*d K)x(+,7:a~&s^i,sJ[Ex.eH N.Xȉ(&v51I}]:R`hb'QJ+%T:J ~Sa5R/㺹Pq_g4hH zer*# U`A08ůG#} W|~<l MK h"U4]f m~\;vE9$j?銊>k2ioA}WI+H"lR)E+\ 5<5y}khѕ~][:$TEr/h`鑈-; xF,%Q2osY{cX'?atdnRLR!+䭫ڏMnFEH1M"f˯Ib)!!:az3 ePk1Mvv +ririjf7X"JnK,!v;%ɪG)ަ{ٖ0O?~ƣRRh "MRV'eVVxML%j+'fOm]aŨ?+]4ўn TP.lϬk"e\#)YtsʶUJx ?GXoX8=bɟd!{8ȀԍُѼQ%4 W|-ceuTt\{-[=nVv[] 2%S"v?P(1)r1HdvI|]Qc'O&Kd'] -ms=y  }%U0#;zF#ucEkz P *U\Nx֏t xMѽJ|G&`JvS|c <7>sلzRpn=F=/藦f?עN9da ͵t?cqc6݈#X0 H Bl$6E9A豶qt?Ga~S=^ :vd-&1)S>Ζ{]}@A#/%gU}T oPhDCY]}J@P# 38W>òE$nQ6~x47[\;JNW0sjD1bo:GoGgzV(]Яi$~T=xœj-\ƛ] N])C0˗ Y" :P Dq"tߦJ*F~6 C;,6ܸ$]T/ftXi&c-dC-n= 'kzNf7 x6./dX=~6@ZF=9Q1 |] smX?hD "j\w âr"~rFOIae9?]n璃[d=zvAD.Q1&h-E_?񮈧3tw s ".VjZ}g[VN9č{85_ (dOD)U xPTx:׸C*P"|jY+r|)h 5Q0ff) % J(aհ:pb-xP vgQ 2n]TzL@@E 0*4(CH쒴6!Cؖpl) * q>u9E4*6q|[ h%MO `HU*p#D3!ۚFPpfS-X,<nzD<9ᆖrLs?iܩ)=8ԽgTVat 4^Y0oV*jy?`y2,Iv䩖m%qu_ "qؖ"Hd@:L3Ț?iUF#"/J"S^&aoEƪ@H!CUV"@))pߕytG\z% PhGd=;h/)3aq4[ivc~X{1ƹF#R`B$CL&0e<"fSRĒ1-5E ]W4v;gYT (jd+S8&IRK$K*Ѿ癛&|qX;.wygKcsvI.b(1y~nOx6OzP%.F:bBVpXZտ4ϻp=V {4G~,9?}.,϶)kھሢ~-V[*n,l)tiaJT6,)vᣮ5 з>7 H|W7 Ҝ\%,f5e|4D¯5  N`5ԙ??}g7oV)R/E~ZfgcJY'sb@;#qXg6>g:7mnyX(xT3+8@oL~QLAVAfL+re0:up=UO5MHj ~p陕|d=c3 } 2-v^s%Dx.|d`,, ,zk\\(`qn]Lȣ,$o"hh+2 !N<?z|QA@_`{\%2Xs:G]y2f]#h[g'1;>pX!P]  1FDB$A+TzƨdTQ L7j;4#wHKgO<정ʲk:^Y% ҘͽE"ܴ7MK?f4R P49 >9[HPK($ ICDFC0;%|ZGrhEu!ZO|ŝd,yxkgITN2XƖ;Ve)\ԌP󝌛Mg ,Hh?~)DHKM9BĆ({*T߆i(/{[㆏6 Z6<ݍG P d~$M~ƒ vkOăHe֓|n[2䦙SM3IB42bhd>wCW! ^zl' o#qO. F[MGqcvk#hSK3k?َdn[<^[E[w<~X\0 NxH!SAԚ"qGEH읓(AJg%p9[bMYLlQu;9 {$i݌ñfdpm3EE|)MU&<57$` 1cFxj䞈 #y22 ~;uN|Vh.W%”kFI i߽fdT':?\Ԛ K^T>76DʶUF8%.洎lεLap>U޷4\7 ^2I4:[{?TG5͑%'~ YU5~-Y\آoJ yeԲjck0s\n.ԇUqZpUoXMh^73La}|gY$fz/sKVbYۑ;}έX%%튓L5tzymKR s{>," 0RU;c҂/9(0[kNTaA{@%&yzXgWP{e$u׏FI\!H"qt& 61* :,'znoW| Zy6ڊV Ql[''6e@`RԄfTؚx, GF{"*Ӫ]r%my廊7Cb:Ywd}d*ܝ翩yCO+KT(I]dM93$9!j ##Uxb`=,loC< uX)+dG*7k-T[%;pP 6л`Co$\ !6£0szJ钁/nJ|aZ7tMKIޚ8Sd+e=cIkg c`;jb ~Xx=O2b#Mj!ou,9Kw< qo:%>(c9|;@ 3%:063䩹DjN3 msaidYIHX9q Nʦ/7v7 ?7@5D(I"4Y3fM7[ôX>I`z!k͜.x"& SWV%sG*3#'ڸ!@f])FXlbqŋ?VWC1OR%A〵e|m74lGUD2ZM]#}0,abojY]$_z"4@YmI0LJ 3) 7s0Kg%wm[ аtX/dxIHtkT%')Q(q LY+Vx M-ݘ6xsf0c0)--%~$ .RU-XAXdKs0chhd(D1~hi<` 6#.Z_չ,y2+AxX--Ug(V[܀Xu{by~` cPH%cq Eb-q˲tckw,_#E~P&P5b hp cџJ ZVb Yʍll\y;%~ۖd L?C(Ao_ƛFO^ j𷖃ߟO ,JGDŠ%-"lM70yN qǞ~q2Xv"o9dTުDhZ3Ul}F lMB`[j/i0mW /Dj}Dge1_̊=_{{Rqh:Rq`mg&_QFLQݝZ($LFKak! 0RmaSфFR%\O_ŧCdZuPCat[ZlkUhhlGc6ϕ@MJ v uyh|eܩAMɩj]UƳ/2_Gօ9ҲhLU)h(}3[| /5F?g*/Z|'gB {( M+ Ǟa2E#. z45qQ4Q4LY=&w+sR$R]uog@Ih=i=V>^9mAob`qp}p c͗"M [^%KQ]Q=HalѢ}WSQhITD T e]Ju<{ۧ-<xBy5t/@JD l%>8zn[QxvA<d4Eko(%VxvA?)LYMdV \b!&-C͔\%=;3W4Ҹbl B &I{nb*˾z=7U.7tswI;hmOrυiX>2\x%՚Vjd+x wk@Zk44<&r՚nyc6M#8[OHʁ#PHZ-06>TJaPA":%<X_)Y $b#w)UN@xRä 6*Be6\0vúvDMsPxg0aBVA+* M$&GyK+#gphȖu;z (TFW1ȏNFHQ%NOtm:q5du$E:[wg HG;=^ 낯>W*hA4ŌTk>UXR'-^DrM8Aa&HUͶU,YX~[SjٴYTKf->p3*Tl,PX T6jG~tFDr襸"[k8`%9"blT < :A J3rWG3xź.̳[|L%">s?v >a#492.p%ˣ߰X3n3GKW]m-E5ͤ0(!`F^l*{kZAS)RcCdLLm/QǮُu^oh 0~Txvq)[a'3_*ٍ%^z&ڕ̒Q3atnfJ_-lja a_cQ+rlmU]{A] `JK]ӲFXЎs)=ڞ9ho;P<_g532 '40#߉.&NWVBs<4]-m)a&mMX58WM2ƃF6`dNalT/^ŵY.1f"/S2o?gmvPӪ5_dt_E?^3+l5z2:_FǛ(_h5YդHW,bm#?GW)ऋ#8bOd?{tQ_d;7(Ϳq uKNQޠO,jV.^u!O,WTҏɮs{6 IF063ژCchv/xy6ͽpt6C{fJ1֫A `  5vsH O~ DuڜF-oɻ1ek/# Im2|n'Vئ70ӕieѝ<0r6 P!VQ <# "g |o+9a0ϖKDVFۑ28_W#pcΞuO~fmG*]m,E/(}e;ӽAnD%'hM)Ece^I(cy)7A+hLjn0> Xz=PIڀBf{Htle͞F%, .Om\ǟh)ݦ93H7~D{17K%!7ĥsYI ʖ} ckigzywjCO 8^ۯ&n=D`~V'xlx8%oE02Q4u<:^NkW B ZdLp)P?R F:DWopO*y,$}TbHwHd"Q٭.yBu2a7Ʊ(g\lb'hl0;["jhRԐ,%-b*;5-V*gY%E y7V0,"jˈf5ۖ2 )J/MP)l%0e*gyldl.K&=R> տ"*)MkFcyyAC)H #<>,GT%rIrɇd-+ VI ~NWsܥ"g+3R,9sUP:? [&P~4onvR ~Z_gdxh#W,-n@Rdډ߾6GAlyCsӍUwg-;"[*FL.Ft>E?$g^]4(iP_d>C~b9{C?W"][cP:Gq9[70OD**! h%l(Q@Ӣe7i`j9Mޠ7O´(?*IЍtkՑM!!|<[xeg2mC]Z˃Li[3\"M~K6\5>_[BR9$+GjVg"D܈u?Ìl#`kMUs`tw@VH02 o;GyOh֩%]n+N|~IaJ-iJ4i$ay|sFHV˴/O%%3lEUCjD)4A5|7qU#D(Or[gThip}󶦃o:j{}vAupIC y)S(5i)[xuM£' q.|<Řf"GpAqVgsdX] fsvEÞzaӪ> /`nz(B $s],lrA!F Ixf 5[A,h0MG~ZSL~&>H7g62߹Cl b|[qSj! *edֽjcP;(mb̹{o 2sfk2s)c<ĜSEEOQ_Y#C6q)~Њ^"6}pa :=).3FiDQv?"ә3w`FSƃKM7cO/tOa2#V>ia H9Ģb)#7ɴ~-jMx$4+f Z qOȏ{xKhT%+wB0l>CEp$C$g,$#<DH ڻ[q:"+<&4E86ׅ92 ʯ;m՛j̽!֏}6*&Ef}FTZgOF+_IW 5t?}ǁvBL/~Y*m]kC#-xc~wii xvAzd5Oi 2P{sw 8a o"3*-&$1jz+l<*< qŎ$PSܕ a~˹WšJ|cj$(Ъ#,dX+Yhv,SoR}tA/]fi 1@v,?$"F$D>wl],:R83rN/T.K|4K >Ai\d}Q7xvA?n'T6[ws)䨼 _+)A)թ-@= &@g3Λ";ղͿx-ea8Ɯ2a[9Y"2;Xun5A cV6Y)B3ov{c Qx!"ʸlQ@ șcD%dCA2!@l9l3B+:2ץJsO(׽.%='EzvA?fjx/e&(W2mE.mWÊf7z}I9rDpqj{D) sJZ]5!ef0"^2KT"&c`!DA;'Zxd_G7mf`I>g\nk"fQkbmxpl5>'X6Q 8ԛ-#Z!H*׉7bw,~s2Wtpt.ZhZu0fNvT2ZgӄniB=Ei04A^?n1*UdG aL0t2sVWh;R#mnqQY} } 4h:etdsFUL#qANO]=Nf;U>B7, EzH3(^:ZO$t#;] ![XFvۑZLYmȦ[ <@5$92E+L9-8mY9(@_Ff#@(n!"GSQ]2΀qPa62\`8+DaБABœJsyBx.̀ (Tz$"CۍfF6z-L7ɜ+)u_<CZ~wӋ9G0w+ӣX8pn)47 k=qQX_JG0zbZ/}.W["=(yrlx$^n)'J+6#EfetnYzw{yP5m70Lhh LZbe3#l"elvCu/nfkh-BhlmlK7-}刺.|Ӗ )c+쩘lC %A{ X̸+])u;"ZUY 06%0 F5C詓2x ^z*CB=:=[,XUZ?ڀ-.+!9i;f'|" ./n?h7]0[;CW!N(X3cKH*ȶ@tJ!Eo/Ŵ& !y@3mԜd"~yH#/n٘́͘'X=R6x -b~[@1Ԣ =e)H,N#t1):]+T3piĽųύsn?!*G.Z:b?mdldbP*)D# +Ajx~rE_]d!Vc;ljVxaS-vH^p]^gf X)QZj@ڒ'Cq'츫d_ bc<(-:RJӃۼHl!8ѰTݱq OGd i<N^[q 2Py}eJّ<;Dǝqd _=e[~я0tHA`g&D45yNm1%2q,߂bZF]UJ|rL#UJAasg # *'S3P' OXaJ$j:y.u#`{F5ǔxlp!R!'b^#]^1zOLCoy//짳0w}023Y@ E0QIGIh ܐLTجhݡHx>\9ȡv>o&_Q6\u/E;m;֐/p!gɣթa)tfL߿y(~h&ƐtrL9%,x '83<gxjq8G$"h3B]>&kYoPwWkUT6Gpiwmn:aԢ,;vKn~r攼49WDؾ $V22۝BII!h;_WQg{jKïך4>minAˈ>g {SpBKZjӑNljQf8fh Mq:/Glb>h-?"#v.'&|s:Ύѽ4tFN *zH2sY?7xf3u;8N EN"orF/U`ґ zF?|!AcF6/effCto\dU?y<J,U/Zm30>/?IfY+S)Yezeڒ ;plYDBG3{, GL%\. NnNňz9H!`46Qxl")`#G жl6=1ccQAh--_>ߧ(E"/W"V8;\D*-fmD691衬jmkYcj5 aib8#nk>j"8lz(i`Ә 4h3\cǘw9}^ЪQ SW12JEm$&Ў05ǑpAӾ}vA? 0"1K">CVm->:Ci:rfE9b!sho\7NVYluw3˨.'C\oD{V-(Ģaޛ%4mvp:w݀4l~o;a?ܗ-]:r?"}*B<ǢE>^kun食|FOn (`6mJRN(9DC<SVkӒLh:̻W8:[#c40 [;[fx@#lZ"ڶm`w͉ER8a5)Vd[9mX,ܪ3#sxqdeeR>b,M\A hӐXRǦa=.sD+eْrbqUiFB_R>-94 HښC| MWw2Fnۏ9qtwknk"b6ґ#Ͽd8B)08p: RDuIђ0ڲaABoAҼAM$$RsGc[Ȕ xDC/adI q0g,Y7 Cl) |xaRO]U#[`at `/:,r&v9ucڳhUn̛Z`.Qw nr01 {(|O:R8Q_ۈCoz򶟏eJaw@v-A(P]T.0\ OG$4ElM! Diz1hXsNW> %a&6+BJY!ނnQ2GZ4 ͳdJ!n)ӎ}XQ񔔱f Db"22 $ T3ʒtI;Pȏ,/;?_>a JnB?z rMbl!_;6>r aٰc "#ZhW0C1Vc#E֭ꄼV?>k0͒AoeQw`؎[ C*<:B5Fa-: 'B%Sg` \U ?Mٗp~y,V8owz[l_i"Z7a_1aaDX#[(welտHϣO* 8^MT&Ѱjqx53M?X U ^M v0eڛYl型>5ҭMz z6Qd aAf8LEealUH{5U9FPRsO CD]_2a45(% f PF%M J&0:1``e@ 5t)TucQ"q:Jfjna5 RD =,A3e6Pa(GYykTtڭ5%YFDI`05fCd ĒOdVOcӹ=u/}o]ЏZ3X+ߓ>Q;׶4."ӊ%ʘje'K+𧟍VvQ WbWv[¯0Kobm~޵+Ak0Wrd s]X-G%{F_w۰bkNKώ%q}vAd?3c>MD*ؙym0EɪEZv| mh?m؏N0l%8/G:]HFȔv3zg"?r-*)@Ddv 7&J8f b tj9Vވg(P0I&06=LTz9zΥVm+Uv(WM(VSvTE+YvB͚<+oP-kł"%d5H%bXiSmxW6 !) 6$S%3Zfjۓc6gےٕrTjB_}$eYf6t*J_.m)GH<ռZc]ϋOnK\<Kr }Ϻg|-CgҟgZ.<ڔůihٓ4_H<M&-ȏ ?u|o?~sՆL]mѩCO vT;a_@WKS(mM9e <`$qљ_q endstream endobj 2536 0 obj << /Length 1494 /Filter /FlateDecode >> stream xZ[s6~ϯ`w+l;m!cfnt+l#LvHHMjnN~윜@ZgX3m `bh=Ch:p1r0e|LV`㌁V4٧??;7ןo/[:t(HNڸIfF]mlB%p\$*xu_t)%K,! 28Pi ϞF7Mޝ}o⠋ Jє/ Z&^Q#o\*A<Mau{ !j %O6PyslAnPt+ &7pB[6Eft`)0 rBK*wyL Wƀ7 UD6񔃚wTyZTZSa(y]s F)N}υS{|$&h_8UjeȒBkOG $K鑥1}R)喿iOŻԇ4.eY 0:c▐ l=f"~d/ jВ$\ <=@Y5/%'dńCEH.:$ߡN6%Tb6>rQztK]TǑ 3Ea=W5LPIboa=QGU@5 N @~$~2'p"[n01ȻSuO6mS^ 2ב}iEӾ,:yuy}՝{`ug(Tqw'IVOC! XEaƩ &S˗l^?$`Gl잾~Uymh?سw 8.)鲏mO?UOYՀKu{U;-`bj;cw}6NHY4rR$8\2?,}^&s%=?uVg>*hѤ2!2M ,qC֜4B 6/4 e!7jHje>@l e[Х4"5eaXU-TfqEȱ h0`2ֳd\$Ͳguˀ!]HQŸȃ?t"Ll6U@}LK 1|OƿfnPX-Z?=Ei)RyZd-ӱy /?C0)ϗh-KNV0O? m~ T^{TRo]2nz\7s6'.9W^Vrz*F7{/NBVQ|)"wU5meI]|CB{!t%~H/M;XO"7GJ~X.> stream xZoF _!%*S0Ia(J$_}g5E^(vNj 0c4"ċLWXQww9S~w2IOȫ$ԙ*;v0,gr ON21\np]8T/d-ϪCXbH2')T^bS*FkQ)&8n:ؗībjͳ n,SO]kVx[z|S da I%lwB9q@77Ķs:/Y) 쌜! K Tp"RXd8eiXO.3/ʤ¥ IdDZ37imlN6HڸL3amf@48i8:QePesQqF8ղ6X=\`1T#  6>zVf)n1$!]$dK$#-O X>~| &b s'%,zB\̷].Pf[THGMHar? ޠ؄s܉[L*@Z é./H9OӄfNw$IƓ&E| z.Y`L*gnCp?#i&UsJ *8ix~-58;k{\UU%P6odfU^2OF56Y29W-65,']dӡFMN77SeAae#~ƛ ]"+.ŖkGuUP1ckI-T Uc M q/?Q+ɀA6M#ť5G)us|V.x)Yu-Ux|/AFXuFDs]@>>w}GOoo$Z#V}$wP^w1";|#g(ﵷ0ri㲞_na-Ywggx{!pͳ^ hIoWײRD kw!òjR;g{ Ǽη#yKge_Q endstream endobj 2547 0 obj << /Length 1356 /Filter /FlateDecode >> stream xZs6_=[!$vzirCyp;%͑`d2HeYqk`i\y34b86^w!qYrmO~8svղ(,&͏gjI˅f?/#mP$ <,"mbQQ?x|ܲøُ4K&,exlN:I~?~ޏ$H+H@ڢ:˶̐aA2&٠EE"9+xubFB j[!}3JrټfhH>!(%p90οsD/P/Ec.C^c.Cw ac]TvR/""1Q.]3jΫNBC f;q>My>HPAFYOw~ . nb$ >c`S+Q&ڏ=F @/{xz_lc=Oh\}>ex -E^j"v?9ӧ$4mSauV+2PzF܊Y V򭲤H_ 0jOS}ÑilÇTUΪ cԫB+=DJ?*#ߐ~'uPG"M`6158*eejIWxyS*I5=UJ3d5uޗ+,|rk-9.S*9@ ";Aˢ ?5UOE\|T{ڼ1qb`a9#afNyp RqD=Vx䣰Zppr]X[ BOZЌ~2S¿~0H4X?X|Pv 3‹T\'_tyɴ .b.܉lytas"ybVҟTsi4::Y#7-td5HNUUo "@5mTVqQcxVl&nNqT%6nNXwxg/h3(_'޹K49O[3^IhھD l{qduFՓ߉rڢmvg5Ëz(q9?[=wԜ+ sK nQZg4 endstream endobj 2428 0 obj << /Type /ObjStm /N 100 /First 988 /Length 2675 /Filter /FlateDecode >> stream xZYsI~ׯ11꺲 bb 33`xrck%fՒWےݝ]U)%0j& ߱T~EF%1 /rL(HsI$J|' )6YjAV='t)Fb cQlb>2&,#EYH3R|TV4(Jc ,Κ<:$,9^)1Y< G/&~#dy|)d yy* PM hп6lR@px`1E O BlyI k|6}S}(YVxJ,IྏeJIx!S1)-&1e3LBdAƵ i-r$"VJ[b :ѲH(LJ519?dPƔfAa|#dX['x"A<2(G9Dogx~SAlO_8~U-Ga*{U^tO9ߠDC]tZC0y,Y3C8TnKx2^btpڛo&Мq>g)uLj.s &fB &MO@ 7&8`Iz/v}Ӟ (22`>aX@4󠒀VI@I(%D0^iPN*eUVeh.9$ "("#܄uʿ;W_'0PHŅ ~&TSIȕ\h_,Gm;C$G!p} \[#@4g!㰂#B(Ā'fG BebF^F9 CG\06Q%εe3"y;4'nZ&_L]." r*%n|$sta55Dj >bj#DWqoQk FdM6Ҍ%h6 H jVD ̓>+ORaȌq#IhRB +Xo n#*r/6ab֫&?^p;[c!}j+G2B=E{}*no?@6];Lږ0i[g^{D|5 ̏EB Пɼh@$PԢ7yckQ(-$yNIXSa9Cӗ0D\è>֢[TĹ=ļWFI۹Ay,nkG~#8d#mh#D+vkᆙN ,JӁ/flr(9ϯjvo* Ұ̝q*?V%4Qge~R'\c9V=0|z],HKsQ~fHM\ʯeOxn+f_A{׿yÇ> 1ܡMJ'D%8C`xi_UO+,U~J'QaVӟϺXu_I@=(?Sw8^šVq_[ſUT{Rbڐ||ÿ?(ar/?|6P_ ~gp_ ,u'7 I7 Tir<ɞya GN0zQѨ@^Eٽ¥#eu;GKVAΪ}pF=ۋ*ލqlQvxUNqQ[AqS Q1iwQ-nGgi:Jg+x+x;U{E@6=[f4Fjn.ѦlיhYgiwkhI'[ڎƷ0UH>h`4Zػ(;WbьiD("^[ iZG;jD*w2hA؄Y*C- LomXج>[ᰫML[&-<^و$[;ㄝyϤo]B E@KaǦx@v;]"́Ao#Β &X,oգ!Wlkn#f[5m 3_ 8 fY un[)O粼|ٸI}rwGjr5Ȉ'w)nM`slk`ԖOHXYtdr:#WWNG'sw!m jM[;Z}QC0Mlx4d߄HH1ĭ0>ýU󶮿]㯞rD endstream endobj 2552 0 obj << /Length 1837 /Filter /FlateDecode >> stream x[KsHWhxznVk`pPTp@v[@0!18{g~;= !EBP Q;NP ^ÿ6%SQ: f: \$L2L+ԚP]c|&q Nt润HoA$kb#(\sE}( z=ugÌxHyAh3۲Ӊi#4(8SDegkϷ|9$#i͐IuEQmӬ'i*.VHԠ0nhIiE` SWz=Ս;D7dGXep4q?&~ E/ z^K,Я*ZXoti]EJn@/Llp I2Vq:鎚\0mw4'igQB)]-kmfuX;21G+z>|kgn 1F58NRNRm_}^;g%8!'o~^8 It$ͩ|Lf߆x+dI7KqB(lV j>9+D$z{^50KsqKtq2Wv;:o&TE1){(? e9}iъGAXeo=yv${-.;UCjh^1uPUV0Vurs=# f*gȗ(H`9> BEϽ(-6˃fᜢ(q$t6vnF Ha ́sq>8 ȧzDjDl I#~у0<GBKb} %^B7T Z1PCWp)Ѵ7d X84t1FV0ۦUauѣ4²A(Jl q7`Iby !,> stream xXr6}WpDMI7N帝m,d2(8H'wq#Z%jt1p`XKoN'' q1Y5GdnLMpv aG]n0Rouf5Է=FK%y3]}bN~J`mS#@K]kS ? ͱOp޷]^W8i (h\ 4 8l؄"2>=T*ntJ[e[%~LsD)꽋ո.ad~/6 HC-T %2T!2TȩL$ આrp\̃Aߦ +?b3-[.;䈹?sL5N pJ%nO [ ᨵp:Enc[kߛ>P@_y"oc[.2nn1́Mm.[)@g vun4h9cMX.A F*-o.l[u-{:?*ՋH:;WyLCE,B:W<02=¿`_Q2QX梫FzLbQ$ [-$wPР-QIbϓJ-'nNy|(.X1JPQoS8 ӫuRW~{MFgE|#1U*:LE[G,E|ȳ^m.vkq$ɹTjػ}ge|Q$!T+MjE?&{蓣I_׳T+'Fw?G9bx a l^Jjib<=>[c\:"Yp9arQH񧅏xQ7p3_(I)Yqˏ 4ՕK> ,Ldu;F KӘ;c#wǘ'#2Ec JF3-όUdmgOք;J/,}e_'F0Ckk]]5OJĵc\:Jo=XAu\IDUjɍz[Uas=!X:6>YxZdYu O$8R endstream endobj 2557 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 599.999 599.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2566 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥knPT endstream endobj 2556 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Hex-Sphere.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2567 0 R /BBox [0 0 600 600] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2568 0 R >>>> /Length 99649 /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̗5x|=5AB+@]sg"Jeo3ʷp 'AGBz_"hD*Q6iT' &4׹ĀC}ی^L2Ow9ɀD^Z}`#>ekR[jNFm|PJgDJJBG[/NڏЏ7 Fqz=Q}M]NKUT8Ou -f:᝷N}ɗNV_{(M+=&$y Cej"ߤM'oY(vܲ5+kP #JTY^T>`C`:m)ʩNfF.WEdS lh˥&{778,tx&Z#Fu:hA1HG-"4Άml\J5El,7J@ሢٖ<|):yᶕ_s{BM{.P3'wqe(nT>kȶCh{[zJ,<~x;_Z`_m.1kYs?+[~iBNAwl1۫ TpHqf*θ4o ^?i;4k$*Ve+2=_vd3؊|" MWk, nR_jnHs|:wM({{!{S˜N"Il>|=k}M"X*H|oe+`,ᅰGUrW?]9fd4j&9< +G+hCg n* 9Ti{Piqﰠ(O3KiZnhNuї{,/ƺp]8(2ok 3ڃ0#܇;m$(񣺵 ] A0\L*ؖ)n\*(Wؖڒ#ekvu.ʺ #شSNyZ̷~AM|ĠqhH@H鴬X*CN#FuT…uÞp}@'aƷ1 vsZ(4*Py(i.o0u~rJ"xԽ3pJ'%{>:09((̀IQV3~{ǢHKg(lϷ-ɪh q)or /2%=%nwH\%&87ٸ_7,k{mU^v Z}@Uqm#tut R'ùVm<}~g9W y{3|߫F弍+rh"i)@LCsve?o;QXx{Y(ps]1JEN p;0u۝#.A* wE{+qԁp?P8tKQmY?=c-PA8*ЄmGZXns>8\\=W z ]pUE_h֗L/Ec:Y-K`p:h6\d sPvO>$>bm~(DN).EJJ7 vU/<3sSGꠃJA%14b&ސRC@`}>j =sYb:Ey5b%sM O5=L)K s1.&妁jFBUdTq30e9 P޹Y>N 1Tt!ę:M33x7Kdua'7nn -lu4Hfqx֭|[ %ŸVc]km{cjg2/+O1G~ ~It7A)KZӦ~fY%|*tGg3C|3XYAXkŕ>cqMd>6*R6uOp?u]۳}Z-} & Zw~uUX8fu<ء1[PGv>nr.C>GAnjBv m=/Ek9u[nP5V跽f=難sM`,d!%}mm.,<HQ~n_/#ckH M]FSo#4mIHY2&${3wFI@zb|Nө#]V.K^IO%m,Iz{!"(đ-: *~%%: {jݰ=IkRE@I@s*%yј:7 ijHkO!Pi&]@O w-;+g*uk(*` 2B4.kPƗXjSuA#f}N,3Xsy.rIc;CVCfp"5VA/˴2p@G66e@%@˺K$[9eq9g x>f|E+0VrF.NT & ȭy"j)F:Xr Oyl%o2q㲧tgz0s20X(xT5 Y[h:ۑ\y:_Wy-ܩ{=bT290J=qH_@6Vl4~Bǩ./8.`.53hHCCxYBKʭ̿c$ݫ—wFQp]{kuZ-ݿeZ!Km[w]ǯ73eC؛pz]z$V6h͸!?XJ ےzOmmFW3sH6w kH>I44L'9]$IlD|1Ka֓.ίd;b2 tayhX#ӺA*"< 󙗻 !G뺝B2(_6`xs#F$ m/S/qU7: a݊Ps+"T,k[^A;rSᔏ%AT:u2J[|P*n r 8l}"W#& aP\u$bqEcZi/ I8I`"$B3:APgZm!YiA!Y:)_z*t,]nGV9ŰkgMʍ@X 00D/R(ϰG3Vq")WW /*;Ͻy1|Ce+JZHa˘핌5zoLº>:fhԛZ:=+묒$3i;(8{u.ĄySXnN(Quc)˔AۉN! _ 9/u}D{lN*Uͱq黌N\ыN=7j#lZ 'BtD|n4* NU?O!>$1*U3џ'r@rGXun/`8S͠_Qea`&OxdD6~ǞF'l} +%.y9kqp(Ƿ69t+!NYG;4@!˕Sf֭ۇlA.vbK'{UO|-w]ܪ2 m*L;Ya u)⼔47{3M`i>VuCy痚~*qPayk7WmJr}US`FtCǐ3_w [-HxW|2nxX eaG[1@ m璅}K`rX0UiL넂(QjsawK > V,Y0nrRQ0osZ(.kLrPzLP\:e(^+J.C WlĜ ,@)N>2: Zvs%J 3k"ؗ JuB9t!]Fkҩ +ˡSIAY%$J#k'kPTWc[q[G)\vð]z3ɴ?q)`bt5@0䕮%ƛn',ؽRTm(m/j2Fj N%J}#1,Av_t1C+x0o;C3X:=i`t:.r<,>]( j i(ˊrkX|*(Fijss%s>m>9:U7ym+\E9vI R_{Nk(ԏxka[* J/A 8!*U.Sb:?ڲus~;Xn6\ue^'=;d1"o{=̟Vf斈%ȘvPO]}h/Hj<ߧ &#1Uؖ>–H#z}Cñ3a?/uK'eA߾s 3 n{T&PNѧpeD L5(Vy?>$rX-Q9SA abiuC:=w$J?|2GbLRځ )gc}t6df呷@^ s1`6 Mۖ8ֹ>ks\N DAb gA:8S)a|T/ч[m#jJ(L(oj\ή w+0&hLJ3M+dh4%n*tC YxRu¾ՄV|>XntR\%76.}AD Qy y^v?Q*HԽu,*StPOavRgiSISJfޒp]=WrdrיoVps~}~Jt匿 ;ڠPuqP^c]ˌaANIoP*D#Yfu{[̠[pNJ”rjIJ[LRtV|,6$mGvhbye~TBq}Nӳ[tV"Iumt+4ވoض P3^4 ?/5r+QWK=K]5-u3:p'4opGvfK`B9.Uk7ǟU* ^v #r;"\rш! cóT;>=(1d|+4Jd2m;VT KM~ڎ0 Z`O1Q0" ע;zf-T1r-ԕ2H~mbT+[֒ ʬ yW-$@{G2(̗o][pɪ%n%pJcn@P*p[qx-u1PeDt 2\e\9w& 7Nd@Dtj\DjDv8l4!xר"s]`|skyٌp hi`UED|طEN?0® K2̙l4w 4%P& RFU2-vNǵ8fl?tW׶3G/GK~v`xUjzywZ@U-Tr3lk* sGUfoX8) .=q)Ge3V ppFDPtdxHљ'Y|E.~ݞ A[{ĨNyatj~xnaußʵ2x OJ#FuºVnN<,޲;L5W'P1#D-k%d*Me*ꍶG;CZTE $( -fjp==;  =)W3XG=A]NA%!rcr\eCj?5U%H abp,!T:GT.DG75cj<]UZ8><= &}s BBt!n_nlkGA뼟ϯ2IW $;_lz)((mCIJ#껼ЦGLG?+{m4_&2|KR=b* 7Y|]XtMÕu;jk?UOO?|zfg=#wQ"\` PA`+uD3uh9NnZBn ZJV/Dа3dN %^1kM.hj=|87R\ّ FwpҀ?w$WgAv А|= FMqʻ>][iьd*˩j#&}ߪ@fi00c{/Y |1'\q;{NFLaCOXx"()U"F DuDAp[Lquk$LOّ23X-ַ<_|Zw #FuP:bO`Ů8]Q6 9mъ$;㠪8"J5 r_J>dn}պ3x%u6v5Wvh{^m@%%W)붸>H(H%YRXKJp$=92fhb&r9xU}E/"BN$0>Xa ["iUTO5Svʆu6^R%yY9(t0ežn _F̧i%١,ic9)ENMW^387r.WJ'm rZvy>WMdl6ۑ23XC%?܇C6CHv,PHQ mPXe#%p_B.0X:@#9͗mQ=߭ghsaspOcݾ=?`sʔ< $H&31,), K 5vI髠7زîm1kzy`m/q J1w)Aqq| MRx^1U-ÝST_lBu3k܎EQu$T75i`,|VF'_2ORicMku8)z[~lF壜3X#iP5e2M;BeXG=KqM6z=E(M*2ڳԴg;~nOaW>(f\DK@)u+q>D6 A] !7滺mSnֶ'w"͈^|HNVvWW^|N?D˒5Wb%^פj[8#X43 "U:mA畊u\֙Qn%x)3Q8n 2Y>W3K(ʋKA8CsX׎cwN+tS:M7uЮlek^PT9Vj uPc\ P8<"˶_Rk 1RN369=9KN4hG)19 [~w7˝qRvr#65V3%}%$68{^aQF<Lӊz.03Ҏ}F\8naU@156(q}I}YHњ)+3HӴ ٖ.`0Z=sR4Ȝ˵5Cn8 iO wM,ǔ s@>+>Bv ?$}FIB,8ZaԱ8#::ڽm]#JlAc|?SՠD\?bT-[),(14!%EU7MUEB2ͤ L3-2zH`7| ?U#r~#HaCHͫ=\tx>JJhfեk@.@GHB6%o]e. -s͝YG+#Oq[`~9Lr\m];}uڎI Y}2&aE ] 7Ҧ a ]!lK;TsPXpzyI8}r1ѱz⇬jR6b֥T'~!=9n%>IT=<[aJ+s"n'01{ֽH.e\VVgGec')η%,I:#F1X-Pr@Wx$zq) ee_RRa{FDJM^7|2eNKdN#F1XCt\I;ڍaUl:_/)3 :bkS=i0Zi/^}v]@Kwr sNPkWnny|!ΓF.ZGoL;,?YДěWsv$H (`%,]}L!R4yu#;) 1& Ar1e\ 8["&mԡo ֗udϤ')_|Q*p {fL3DA( /_hA=GoXН޸3اڂ4 8B~EJ2*ߧ-NT7Qg7ܕ!w>Wwm>ZQa],|8n^UZ'wqc99^/@]j3SRӤD?XRnIW%P7Hdܑ1 )eZ~YӲ =|J-xԒT#82HEG9~<R<6W~-3B8S6-?>]P6v"k RXgf5_~ZM>q$),l#q{ٶ@ׇV )8tY9$-M`5> d>dp{G5wet 6(9X[REw-:.A6|e.D=C: ]-qW=ܑYL6V<Зל/r BZ̠qouRcrR!O"&sHEوq tk^Ci9%o|oGvbk~uu\SuܫkOR8ó4̭ Sܕ (2nY}IK| 5mk>TOieW|ӴRt>2'_3R+?z'33IK0I)"2"Ey{~6gkoTL3L{dp~ 10};NOMRcɖM8Un Z:C\bk֮K$ń cݒ?o cP$]Թ^t8cw=Vz`XGYTDjnlCRMOn7ֵ0V9m=thmNVsb¶ ۃ])+-Rh/5]ƮflZj3aq8QwW `!ȮYGFGY8GX;m҉Ia2q:x K:2Ah ڛB z!=@l 6(O Хz$doG2q`ijmQXHTY[Lr6E k"[m˺rQ[빊i=yRIx ݞ 8^&6|(L6Ǭ1#û|~+w0.`Zj]֎15/-l- 6IIt=RaUWzW[³]vBq"ҫ0o "̐VG{z .ƽ:o\ +Q& kx0I0ԃv1{o |] 2 H[TI})>qH\#|6ŏwQX , Rp*]N{zz/Q12oQ9>r,6āxS06ħu4X,󺆓Q:J t %a\Y-wxE^z@YMr~kTזngmʝVyj滊VrvZg;4>i 3XO#Q1a][W%ıDq ?c9:P,Himj;P@n?|5 n/(o}`>:WŒ!M,檱W/vsWO/O:h؞- ӣ?;:E!n_kT(2HJT(~Obc2 h.Pv.8໠|Fb>_Z]P m C(U"wg{͚_-ײݦi$/C94e%&QwԵExo߸o[y'S5Fi&"j&bN,i,ؾ::+?"tG vV}>ș [L~MQ@0!oy暰\${QԬwԧ\Uض7?|n#kDK$S/IJCz={-YNA${6;}O?붿[>MšR]XGus]7RȻBvV2k=z'qH'J,T6@!)9p/kgJTU;zt`}Y[hm ŎqJ4_麤)_!KKh AoJ#cbQ!&_ 1|;5@apN OyH0B'WV 2)8"k&[(1v+X閧 nyg م̇LvX_ɺ>tY_עb͓2X޽DFt8*mD헌$B#7U.f@: (E0^K՗O,. E&?8ۈ PF,dAq~Ra?|:/ &SbfLF"X9(/= m]vM;c\8h8W8D1xTReoۇ|˱lI|SۑL243X%xC"av;HF{z'Vzz7bn8Tz1|*nE~|'^R^>h==IFdĤnpqIPdvrr(u4agbKiv;^ɷG Hd>, Y$[NMN*v`8ECWK>%홰'w'6ל.C3X; 7 FN9p{ (Pqsr,_!^4Tfm8d(8tfe`*$F2q4Q3_w=%]]5M(cߎ3X*݇Ђ)ǂc|%a8L/"З ^ֵ5 & KA- uOxcz5$?@'ϣ'8-ƺ}s{4na)Uk;v9xۿ1DN "~EBSuL ȺE tKY!@8yrKd[Ͼ叵eqJx:duOڥthp߱e)ktp -p痞u4&G,Bβ\oO8WyσŧQ,"wE&h_I! QGKަHWcnu~"ѲȁN-7PjzIiCz1]ݪpUh"HPb3` -us]gxGbtN.s0'h%MlSͿo%X!]cjN&f@$wԻİ^ъnvW,i{'Yr/'PBĥp8K9wƲN`YKʝGpy44rw cd** I(-"'c/aT45evXqظpyjR|.nrLLD`>Xm\鍐AIM\FUz?Pf.~byhu@cDm"jJ+^|r^?$<=bTGTXzaN ǖ4.7-4hgR %PQQ+'k0'^KiJ}k2;gЗT;5#T <aHm CX?,\vksR]qgh.UؾՑ uC{|ˢ8˯>,jA١D@Mmweݡ<3X'%q Ȉlfc >*y=<9قn<a>G'\.kʆ8QK͜¾DW\J[D\z-ĥDRM1I L&mF)96} Х\J}@d^7Ѐ)譟N6C.Ytm?W (M&odb4|w߶ٿMxjHQ*gd 6 fKx%t/ k^R%;ű}1cG C~ NQ)I*o*^̠e5E Ty҄Dr1ccɹD9Sp˜Co%w\\\JKZz.f$ӛ HFz\[DHN*Z EB]\vYՍL#Fu4ulaL vh)Q::LiS}eAM K1KaK7+W !%FG1QldV)mG20ԧV%+)!n=r{x oLo/Bp-[ʦ~/f1nQف2UաRf5Tn# O"2@(b&uT֓+4+I?z^Bnl9A$YyG*%yau&Bm[%y<~%!Ƕk@C _^wΗ3@$w!Veagal`p*p\@pF<َ4XVqq,/ZD/KEɂ;nJ 2% /*k`^Wv<$JtmNψ-<L;UzznHw>m +˾Sܩ'bm"246"2PlX3g]">L[ z{qrN1$gD.V)sҩn)R6vkXdG^B'Aջ*֕ʉ*Fj]@hAT1y¾ 0J& E6\.;XPdpPJuQ>YQڣ_9!M@(۵P;PK!5T{ U!vPs J|I0StOqR̠Z$J Y]钒\Ќ`V 핇)Ou@(?DT*ev0sJL"E)RLi[RJBʽunG,oഅUWu?xQ O4-a=L|X֖尮x5J:^k%jWp.c,JjJʯ~j\5D>8S7m>\֞Z0_wNy>LDŽ/sE̗}ݹQjnE6>D[|u@;2sCZ Ihh9S%& IAf1Δ7YmxH aPe,TYkXs-s3⼞A܏QP&}ƛ v"I;Dx #E)F`$ MbxTK^HwM]GﮌBi6ȐK"`(jjnۭ­|T,̽Vh_3qfBd$fv HF,-q kWVīt)@,_>?PQAH&_ .QL Seݦ㱣^QV6n9ՔHo$t+LG}:|۲的*mE$gg;1f dq) Rڙ&[9c%4i}wg "pָN3_ %YՅr*ؾ#?@5&~1%l[B2sh Lg<$O"lK&y[OƙV7z(+C=DREU(^aM5Rx.u3f+2:5spj:ւl r;.8%NMf,=nV⟝gø\nzT <,]儘J˔:'O5 m'_bl3X{CIH_Io3a_7q/l[=~,)r1b`lD*}/, A4H#K&>ѐ̎nx%vuNffcq-+hݗǢ SNHHB`{ Up=A42u#bb2c[OΜ"I-@f9 4Jڹq*nRQuFdžlcGɯ;-Sb$m;3X܇ Nz6(dͱ00EO&*^6+R48),.k"w^rx2eS;~q]:|&Dײ_ q#lK堲JUcA,B:{ JC3<|",E;E(A:G-}Hb(ӂۗG$=$aCf f5[r9RF#zy5(x6^Z+7->9JPpRx_c5E QMlMB,.&+%3|{k>,R_Z3JLCxmheʧ؂xhaCDfbaOohz[k=yDeTȍQPȿ"(aRHpZ,M(׽y|ֽ6i /c Q~%P *4!]$qOa`7t;~M{mxʷalUݎd`0?1VSO<}Uܫvdw;MIAܡ%نछ9"hy3.m2::V~06at>u)+YBā?bōuħS}@ywwY>Uئ'aŷu5׍3*% C c_g:;> 8',X: [Mu|QZQ&x|`4F@$唕zN0cf,&ZnݭJ55+fOHr "$$:Ω@D;'eS/ .5R'7#8 N_jYP*kO:aI-qlQpȑt!Eg7Ag JP3}y\:Dh7QyDNu OtX_Gvd!f 59E,t_ r]sUX[%2َ젥 GJI D dxFIF'jgRIYD8r_ n[1 j]nlwycoy9nn_NZA=v/Ź.ykOfdkVs\-XG12=_ 73q55[ND X-jV~v0fw &J WMT$]v HZNTL!Ih k?aMIoO-TCE?H&{2}3׭rk*V-(%!ƶDlns~u˦YLXÊ=3npsٺAMJ˅`-u&haum[ s),mwnAֹԔil6{7ȶH_FqU,.]9%rKց6l[[5H/$r5Pȕ%6r/ kZaMr |sskQ:h(铩,'.zC?,p2j%^{͍3.}{QWюЦCӼ4; 'R3_'T1#A kwC.efp?2vtCM1DFe|~~.W&$>3n\ G3|Ď :. ) <xmIeWV[tL֋|LEam̝qu{{6D^yypՙEPz׍WhzXuK]Hkxf!:u;t7~ jAվ3R'T/TC9wAO9ŀ8(qkfdé/L;2[җ-SP*[iMKJ;[Sa4-xϗ'vQ.=?,n(&\-VeE׹K #F1X(2wh'kz~K޶0! @0sGTu E/mVKnGP {-t\0*޵'MY ',Dx?bT/[NNua]}4Ӓ[6ՂPv纽j{$wO;߉_; 2v Lj_p+.Nu(6, ]Ϡّ3XLKKS^/_ x}AIY7GL.ͭ31]d6\\K;JxajcG|V<0BuiZ|Au2FZ''}7=l5I)FY;b!GHȘ`: mDsT&ԞD۷zhǩxK> }8a˞{DZ.i.P*2⊷WٴQ:V G :¤|MY8]:UfenE|?̆EbEKK=r7_U>L8ĝٶ$ 𒕬E|iǘ +zݎ ^$/k_H*JQR %wwL&s zŷOsyK~Xymjʣ>&ښr;H[4U7aPl#q׃t<&:i GC7R<49V\fN4l=zxx^}<*XJv 6~ɩ{Z>`(!&u t }~I8ݎDT : ;12##S(Fb{῏ H$DTS$^YΉcl2b[|hǬ|jTFW=+lq\rX`k{b =_s~El^jnfJoZ'sv-:ؾ<JJo7ضq@1k[<1-8;bva()[EJDq@Ȇ岢rQmBAmfi0CZP8s{ʚldnGvb R=Jڹ\:`X0KֲZ,K?ri1qQxoxùcC}g|E-13(cPƻpK6K☘A;2clBwDIZZCӼs 6%̓p"iwET)qIPw $p&2ɗ9ŷ]+:jp$Ss}ݰ. ASfrSL sRHM<=Neu"+̩/y6$⿽pcKLRyp&]Gd@B"%<s,Ҫ#֓Ս ̀as]V< 6itQocu;Tx{ )6!2mc[dB2)a`=6I|4Fʶ&MDp*`f3_M  cCܙM2]s\w60c$0?Ŷg=,AYkp0 ?Os^RT3FuxuQ>[@K`3$ʡ*oٶ-RH~CپE"Ą(䩟5zBD,L\?8jO)&s҉L8jJD_-/ P3nW8XZ3wގǥ,^+qZ @u܊IRqj(\H-偡|ꦤ/ΤBkLF ?`g;r{Bt}퓙'MiYnak%G+HQvXv{ݼc9e6!HS |-ᾨu]Bۧl4$F!UJoO%u[΋64/c9ug4+g!|I!ʡXHUe/sjGQ`s{\:A՟BI=mƂS)iL+>8HU;HO*\b Co$~V<Št[eiBkFvz;؎+&M)Pf:9bh  Q)=z ANh VU,ұÔ;X'2pg8S/_[]RlAw򱛁,q?& BA,s!sۣooЪ#k[DAL(S#n !I ZI r6ۺNΈƳLmʑm*IZLArbnY;6z*kcMˤ"X7jf$=$ 촏<(XT_+Q٭D~FwpoN|.&&|`I.*ubU8 C : 4IjJ&#d>e.i=2k4[<:J{^Sx~\֐ wi+kuZݎLv{QWq&I:rJU|Q#;D fOuNO`BS FxlVqN\ZCi 8oWt\CfdG)`K4>;ȶjMn@YB y48&\}40Pi`b| YNil>6C.5Ű#QQr1.B_ rƐJLthH@gDl-'$bk6D9eoTvģC}or*JۑXʷWv:PbɯK0UqL'r%eg1.Kr|6t;S+fϾF[I2V"Cf0`` W.qi@DdiND eV2ie}CsNx2m8?mq%bjtyL5$A5<$eY8FWڥ[-yazVQljjޡ"o ,js:Vwߩ/)Y綽nIcoܪٝCLi6Yne{~ݻͣ4|枪8lzq:-eNE= dpoZdn{p "Q@/Qd*Njb4!hżG"1@\yuR;X|׋e,yYvAB-ۑOM^N\ʚ?L_5Iu3j ;>SJYSNi2-lqZMrI~~TYo꼂:ar4j2Uq Pt;~dKea*)R mPF5cYroU7amφ:]Gm;[\0- _i]4K @W`X*<m" Xʢ71G]+("əFn:\/Zz]_C~Zj/KV%_xr.Q\!&Aew8jF![?m51;u#Nѩ?`/{5Ǯ.l0Bn8g K@X W4Zbxz yxpHP=y2>w6ND`.dLAm EAds_V-K]I}mv2^-Kt+f5ԃgCw+Q Xlfvv`x8)(. Z5JOBP `?YW9n+v0ypM37% K[ makնujPr95xu}zZyBN>[ʻ".LjSW;?-_+kd׌tobw FZVDY1dD>Tj(O_4gNe}> #.}GQSJ=2^Wl:ƃvYRM(1s <ئ3Z4dt=(w]`He{kz=>Z?L WLsszBr~>qy;ԃw=6;=vQv5$5Iܢ]Y0L1_Ut]Ru/1y=n/1 n?0b6Ne= 6CAk+.H9)xP}Ƥ7p2q9Rjt^̵7}fWFl60Pr:2W)qWP&`;6%8]8.APEĈ* %CXAuDJEvFr%G>8鉝&n ~e~T fkZwNm. v"{8:|]0=֮zƨ"l<"y.#[sħ˩nKEKvdG)OjOܯ`G?`Mh' 10ubx^|x"^76gN֨Q.R[`)oy7N5DOP8󈖿C͘WTC'cm*^ Ev$ lPnQQY;9 2 Nm%8hZ8J j v출?j@*^NGN=j+&.3֪iQcxW&CD'C %! @H-yE Os^G7Om_u?u :V̌nBij8<3,@MMASay?ouQ;NdkxGݦñ¾SQq`ViGW|R E`w;̏+;ї|2PFNEY S Sgspϕ8y HCX;X|+@t)Iq\dܠL~~݄/|1O10G=5LJ _{ tL*|nUc/AY7l`%WR}Yl Os/~ytzHt0;@l[M믩9H;yx6m0y1n".*><݌dQL=˺W|YB 1<RS:@n"6BF@b74Cv'4Jǀ",V}) *+PPul)y'M,LVkF)娳65.fd'*` wVT:[QVE47噧K`'"iS5T,?հtQ.dAgwMdo#j a|$TN&T%:RŘ>Ѻͤz5`@DHm1.RƢ!~Zk=[/e5 ;#/&SP՚x/73H7>uwܶ_C3:W_s!fuvd Ι L*`,(R=Ր"_IN?SHRrMwI7y.3XzD=ɹQ9\T4++w!4+l.nq-$tGEf?/Sjxj:^ ȗȉU1?qm77|'Tox45b_3`SzugG>G. `UЃwEl9\:rL@saCջ@E T$rL"OUdI{֣ ^gQ\:mx-;p;MGO#9qRZ*54Ȋn{]Y D+ukCA[EvأAjʻQ;X!;ԋ;R/bz+^ 8F!zѦҦ;XU}UĹT^!*MYMKD?\CBtyK,[VggO. ,V.hKvk < e/'av$@ZCae2&6I ՏbnY# <:g%RxW`3%@Ho;SCbvh<m^n%Ş|;; 丗BԡBZIrIpIIPń<RS ;5;Ve{գG*#pX OB<KZfsZ.8k93O}mu1x+jeK^ k"e N?2OY')F%yxi۟U~_>G `SLz4 C`Q!ЍO <JOwbQ:Ì`G5BQe˙8NCȩNPsvp%x.^I2e+9hkyǹ%e̛m"Omrb<=5V}{" |f'YJ+?3t DH<˷asV0ig7Ҏ6|jɅL)ԆTL3zߐ2y[#9b`O&FX\O/Wv6Y "@Gj%2qop,户0%j/ [+=')/W@3yK"z%v=%%:WC=Q(5U׬+rW2"P*5Vw@M3w"BؔAtUaoSa~I8~ f9F8Ѭ%KJZlB/e Ǵ 춶_Ou]RRth;FniNxF2ߨjjǥNp>H!ĹùOP,M |O.<NΟssphu_<Ac(oz;vkʎVPߍڑĩ߱E,9y@g:#Z|,vo6ʏn"6?b3N%8 Pq:q)rDI*\Sv밪Bۑ 5q]N͊ c1vt4N{p﵌s/"%݉DQ\=)=*Ħ Cvq&4,i_\O\{$22UFB^Z!yہz(e/1ȉ,cCd.1=~RFہbQRb]4F9]4;nR zZ=g:IlG$rNa\nyeN ,2\%4͢P׾ ( qsjOҸ}M#_Zڠ{k!>sN+kÅ%y%~=ܯt\x#*WczLOn"wfZjׄ;OYhef^AtU/ӣZ EƳ|c{bG,x/!cUReNοH\zN#ng86W5Ԓ/KVmԪ.\}5^jtt=ëvdG g}PZW&׈Fɛ?cT$o<{aqu* ]A{*[nڥvhn̸ŕ؃Z3V=#6lrDC։2U&?Պm4֩,Bfqm]W.fVDkȍ&f )l7κ'U`l #2e4iaܶ UiUkPi2c9;Ű@O=rX輝uϤ>6-͖檫A,0cp\7@3V*p1N}ƨaٱ2zPRTj`aX*>[85Qs3^snb,*mQ΁*GHpc ꂻ$mqaxvY7S@sA5T|K+c1IJ2't]ܼw{r+GԈlT+mNW(M~O$ da ϫ(R/u;S 4"= i 01$ܰda {C|%'U& X58"<0Sx8lH)QRpzdHdKYd}{euF[zJroTp\.|8mL%ͯԶI<5S=V2]WؐL3FNN5# B2jEgt[ֈ ~ <>V7AnI(!qXKKcr@;)X44]o3 J|ہ:}8T~!9ڌ"$kX[k]0թ3r|3e'\nD]bsRdH|2Ycq1\"i3xuMUKX-W"Ӫc"(Q71;-~ӣt^v"Ox<gg=E-^>XtY lob&U-e{3!Kr ;e]A8Ep =X թy:Ttmv' kZ0'bLsRNpcbPR) pH='@z6iʞ*%6)3mҝ}q=:-vopWAKF&aS*&`S4ChH8pR\R&dtA;ZIپJvPkӭXZwS;{}T&6G܎e m FΤٵJ3[kbvNo\91ՕpDwH9i!Yx;s[w(U0hs@mځA!L-=y}ɢQ{AOxZ]3N%噙[fdje|Yڲ"Xܤt^x.rw>_ix뺿p9ܖ^ tt@.' ͅ\y-ތ[f 0hxܩՖe_/^ d3S93p7*NŨt+ bv>~q{]q#6p09:eJu>'2мmv6R|1̑sTya#GQ, ɞFܷcZdÔrq U^b*=ۚf xψX^B/)k{A̽ұAd e,جc>N+:Qlzcfk1sZH{gXiΡ Z8=61vTU7z8Wp? nO,qhnNo/Z 4tOk-utSVCf%EZTph ާN 2Ƴse;; tXnS7>C\pjTslZ|ܻ~;8붬NPW3S{ٵV;FypWT*;(Bk-|R2񫜠;a|;Az]uߜzA Shrt5AJTNz^ 'UyP qI+aꔁqKIلطqP`dDӣ\ۧKh$lJu)Ur\@ 8&5>۳2MQ`ʶâTSs0evde#;id!.@(gtnk?(hhH"&A;91ßPCj_[+G%5OeLˮD(I]7*UU+tؕ9i1,<@'U2CCSp]_be]1gFb81Uo}]5w`]y2> >8}A iK9cSb\s3~PdrZ@8-L WUf`dUgZvCH~Nfl^AeQj4s4oMG&Q aK*M[RxhCKR)ycbn{&U4_bY˒[Hx]kT"RV/N?or."%;?\K 5hGX 'Y/4*⶯uyg;s!w|.' <辚j*Db~R?CITqzX6:53qeO[|EYH ~+o`= tى6Ďrȓ:uyF]n@H3NWN(n wGUu P0hwJ*i텔'bŌHϊey;tT\ ^{YnK2sZé6v{㹱9(6o !Mn'jA#OΉNtO1K~Xwx6fH ɿAw08T՚ήa-kb) w&0Ȯ%:0Jbk6S);. y``"%iWvv}8Էގ Nqw{R UгHbuWMU0Hy8䰐O扄KE(gl!i*DzJnAS@F`sY!rHC#{o -J+ ?da-ZiFEAW,j9+o-~}V @a\ʜ{o $ٵ9sgJ1VMn U.DC~  ,N}Y/ѧzu%7sᘨ B.P\7tQB~k5kI 371aC!N-zRXǺ# G \7jumM071f(ʐm3pPŘpRJP i_K^fBR2&P頂""){~TQۿ4/0&(ax~ aUr Ψ]DYtjS59l`! S+iԲ4O%{i1^g3F19Z f:O}3՛s_ 6__JՆbfj͜4g.uɡ?an;s;s[H ]zTcTk~:]`x.k8ץ`(Tt8IA.y^YQu׭jpܘfJe^ӽSZau|le83fqW-@Y k L`jJ9n4zTbnYf"c\6vRx %[V_A y%_M2*~Uo$]6m?P \W,."{z\*K4}_cXݟՊ? O@! '2rs >8z)rz%#  גJvVuY֝48g8G o/G˵WvT ,#adg#+SgT9w*xNr.ikD$ovRIT|F`uS/tbq /ݼeN@BשlKSG$ߚ=sHq+7!fv-Kk)2mql 4* 綺)@b,c"6ӼIPOfyL4϶(_fVg „+ԶuD j"YbAƒ₌|9 0_$BpJN}e L?&pe0$7"@1Ej;?;i:!Z?3a:$wcc iMHVE2ͨ(f 񘀻[+~Gy0'JCbGNl_|}jWW>xJS 8Sl1$&vXlަM;5fMYeQO59k}dݩ=ܬ^m9<^ɷ'OMdƳs{ٙ˜/%Y n=VJC *RCz]RϗDө}fdGq!`u4R|2ُ5E ɸ54oB#JEzq|ifSw_K/eWVCG붹nå5 *QgOIT8 ጌ#5SkMk۹+Ef^vd@&|ɶ1Kgd+g:(w*A:L4/YK&$dc^ZwZ!S NZs&ۑ&Z!Z!LԈ@d2>BziH@" ]4?Z" }BZÆ2Pfv+S7vnZڹZb${@tfP⏌KUrڏ6*f*6;(wl;r@,c}˂ ÈNO^c5"utkt 6Jge`w{:sr uebHePҩq'a#o2<^벥M<`JZij9#m1G2 J,T{lT{ @;S >zۀڟ&c WNv,QIN][?\dKXs\$wX3ny2Hu*H"sޏ59!{EVϋ;tua@*0JU{i7검eTr˹xUSoGvH ij 5=\)51mUnbJuٙ^Pe[#tԬ\T.S=兞jPhբYSn %s|$v+FԮB̍iec˓n0v 1;z /%,t91uʎ-,d^}CR7QB4+⯧z\mj(S ic0$3.*?X 2Jd2>L Xȭ_z:>pUy^r5vzwds@%u 4ey^/ 0˺ށOs{­sH-V i_P]QMmau ں̵kxV XiM=DrclfX"cl!iKz%fv6 V VWEp #(2-5[Ti o](LysE cO8q q J/(Wl Oss29Ӓk.njw{^i,~#S,3ȥSah\'0Ih(9*чx(ِ d kF(@t%i\ƔkyȂlQfAcsՆ<+oG߲[e0i$[PX9yT7&^-u/E"[fZ6Iu;x+F U^zgOZ@= ';kk3,l;T;s*.zv;}M;t@3 ë!diH&m\'/;smʢ(m,ׁ1=yK)G㙉&I89p,ew(^O}$ŷrM T*V_wxq%"KQ\*Jfw0eT&n1N(Kf~ߢ OI9[Ӊ&[/2_}u/e͂p4Gug; {Kүϗw17z?6(>.?Si ^DĊy ЉJlJ=:S~JKUmnRϵ .G{+1a]x0x/_^RORKX*H4n; ,}^I( ޮx7^IW&6V)8Xa)l/$Q#iKZ^2͓ɯtϙ[ mtL;4~-c]k;痛e:* |ӱL?[wD'vBxv>f{ݲ˪lBO+>3鼽nKsgfsX<=Iu ^,ӯ%vsS9*eƈL- 3Fuu1;F b{2)w:_E03!fOe0C*7yƨ!b̮ěҭI]n:ۀ$rt%HK>(Yo ]%~* ll}:/%Gح7uq=8;a@}(a|>@O4(x,8 ;'beYo,sVܦ[%QvD6L޾KԴiRe*!bhq)aD8(w/% w[ɸ堻OZlO5A㔼<_s R_cRtk7 j>ӀB"qbX4YLe~ӌ{Om/&-TqMM(aiH}L,T ! BxP]d_ڹm :lKX=2zl pa&ZQĔ'i^Sd3hz׫:)K*wK:͝| 4T۰&mzԳbv.u=xZEu+z52[vEFhsղYw;q6!%u;(o.Kv6+ bqhNe[(R.$"n9[fޫlIh_`FO:d<9{=Q\>%dzQ(Hb@TQ$&2 A'4m3J&R'N3ujsFe.T{ $Zއ+b5w Jk[bF\^>lXT:jmjoOD9ӔϦYB+J+n7;Б>)+^A>?cT'6 o3E@rx\ګ8ua5.IY* A&{Q\'5 4*AZce%SkE9.]h{qsyDžNQ]gQ9 Suvw+=kV]NL.}ƨz, isۥG!Mt.IJm(PM0*>]j b}K4^-0bw&عkeT:!7VR\>^n/[A_m=&JR`b,o[y'(3-Ww el6,rvT `iZ'.$zbţ(0n3Ƣ#3'@. ^'Ԛd_BӣӒh:1]'4L'^DbcY/~%V ]cfv @k~(gfIJv2bnt"It:;x &@Cڀ%D̤25YCruïR\_} tܨ} ma#[Q@8)LP5T~y1H$ 1'!4AťI(/g$:[y(h t6.Þ }UUQ_ZE ~^˝f(DTsN8m[3ϷG1t2OO4%vY"タ.s 9nKͅmq$A1ݬF2Yh K .o Op =IATTZ\yIo }mkFlq7nTbNI.D:iࡒo?KA5d 7 ݓY-bnKSn]x*3ۤ;tV!7<I$ s ;A2Q@HBڈ@ Y:W=j~){ax;s?ő;eue{N翖6amTlu!ée#x"'3 Hcr!oEk تw"M~Rs6K*E'b=lǒF*XaYS n/!%楠#s}_ \O9U:b/3Fu0xr.)mIEDTS̕oZ^RlщQlFOF3밽nqveT+ȅ?Z?PZ7ӣ`s 6)\¯p,.!prK6m!IP*'11/obqiyaćhIˈrbvON`3&+,IG;w:*e.}KFUepɨIgCa0ugPsZn"㫐=_bi-NqNѝ5%fIH,X1ګu:} xB S }遧wqk:67K>cFsՉeE-$}=kff7!T5"W4r?a(Z2Q<)LH8RAHť'5TdowvFůO+2A_(f*QȱU;` 1bnʂu2>^7/Sнg]`|6-rv&TLD|gXq{b=׊Cu^bbv Tg f_ HZa)Q$bQII׸c.`ޗLN.TIgP(ZL[-jo M;\sSoi ~ƨh[nD{:tqBɥGoI7-v'Sq ?ٙ^#l rUESUi6w>HOD1'U~>[?Nd*!‚D~jK 9+ؑ?H[lW2-\dug&~c3>? 7k YWbn^ #!#VxrILon艎Ap-v1b=&P[w}mig;s#"B$! ){o((̮MNя uSyD.] вrQ-Prkf$3Fub1;Eq^ZAق]ToR~<7h˖QuܧiA iR~87˶=soݒ2,W2$QEuqbsG^rux:wKiFðKaKJ%;u5~\(OƓ%Vέ/1Li=: S;f OZ;⛎ar%\MKut;w :=CuHuJ&CB3ׄTA!EޤuR{=֢OKm:WȎwL;x_9z;= ?4ې$ XfBYizZ3sCW=$v/oIvP'ϭü78acG_S/zYiI*淄n-?Έ-Wk=6&EfΨc{vpP,`-'h>M_n Lσ ?1 v!+\X1/jnDd+țj24g@L;YPKt"\Xrm<{+CT= O?iWDrV6`!V?7j=goQ Rfz 6u͞kfJ2dcAGR8z*&d$s$r+edM}<Q0(S9´e r{]E)(|"| .wa3O n< ;B;ZYR٧ 4^נdz)|Ǯ9@x _ڏֵθrϞ쏬xe0U/^yػ_G+߷n: endstream endobj 2559 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 599.999 599.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2569 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaP endstream endobj 2558 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/Cube-With-Ball.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2570 0 R /BBox [0 0 600 600] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2571 0 R >>>> /Length 962602 /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%r[ u)lTg5Ƕ]VurI2%xzsFBZ;2%qM{(iYv%J} gɊŤPjb12N:О4ZJјE& ?p6Q>)}wr-rpQnUj9L~{J?ޫ^ʓVŔ2޻Zc2w2@=O^L7RDiNqU PcfK58՟fWQYSjW3 FdpȨ0"ȑ:7F[PA)|_gm|~K܌Qͱ]Vq랆e6Ǧ)"ax; aŨh"A0!"HxAVAr L*;)}\#^5 JxUZZjVe&X!ؘb7~EE ai@fՒ]tive=.闭۸9jJ ǖfxX)eCLZ-ΪVU]ڌk+r]v- M%~CA7L[#QdE(")ϩ-7#\ 2\U#YMRKbdmVTrGkTl͡$oqԪAh9p^Iᷧ3BmU/kYʱIbsE҅Op M``a_sløe8i`M_=1,}X8dV*K3z0nڤsj-%APS)<2#3@CC^~ciJ}:%{;YTP]2/=}4HQ6t4BGV-'Ò;6~C&~HK[vl߁jF$*V弬m74:xcX{ k0S6[0{q?'Pzt[~=Zc ~Cs*5C2l*AplU[n,7Et)xDV: 8hti+ Y".:Qʞ i _٤o{OOLݎ7a؏Z:\ ٦.l-)Qu]0R+ٷ, q*p_uTT4{v!(Dô9?Pnw c8#q=èb[u~{J)XّaKNMTkJK|RYs}|B*k<jaV"~:|֎iTQ/"YD.]{|yyp[,5\yHM$qH{u|;%∰-^qk83T8~mP T{w٩āÈKPD}T*r1Ta0QqWAi,qJφ "cjdɞݍ4>S>:K=$ j_w[G4B&0bY  \VpX||_iNӺ!3`sEJ.\rJ.R,%k]rUȃN M< ]9 ךE~{_wLl=6g١NjRq=BgoO;C Gt@\rV$ɽOLJV\wMlސǿzwu^([֪gوyOf #pX>L}gtJvSM Æ=tMVҳd@l^*3 PЪ6FG7Cz:gnMمlűgt#Bu+1*WzrjC#NFԣV<K=8Jq(h"AylˬeȸDv+J:)֞/Ѫ}'ۿvyq4cQQZ33Q;j)5=yM!5$!I1U|ӟqH˾|>y  _Ke^ -\E\Cz tEGI) i6YG?G?=xf}ckK|~{J bݛ3ithЎZdy6K`㨭BgZq (EJ wK$wU峖D![NEdTw-1y@(X)P|[cTc?HB.䭇$~ߤ<Rp\ j4ύ7|eȩvI^+AA,ٍ\Fhbô%ĤכNEJ.&4t`Bǿ~sɓrY6~ ?({XZa ew(4rKOK&Ǒƃ,.m5K#6xD. @EP KwD1~)XR&j*3VA(W)p-RlŪ4 5%"8u%?P~=ga(=olj3(1-g?cډ ]PX||-r.JSsc&T݉8'MʿQcF{tɦLhocUl qL̪tv?SowON=c=V+Uf83 :4X,#g`|j޴(~MaPc@棑F'&I.E{W5uNd>1ˮ2}A H)ic*{m*!i7t'xP;i2'; 2*ӭ3J *]zLV'R[}cl>hV{\? T+Ċ;g*3lCM3v{.ӱ޳9sl>juB֭aȿ! jLI<iU)#cny0.s8Vp4qPj'PL@<^cQ#`z;MWN~W}MI̥X^.zsd'Ta&T1FGBndʨaQu?g^rg )W#Jjq5RZ/ 7a!j`ƸDk{6Aӏ5m!l)eR|E#pfCV:!{Q-{̰4#oihIӶ(Y1J%+lRͫ԰l01* ͑הԆpϐmӰhTqvvZ6€e[}C(Cw^Rs-QlJsh3vkEb#DfR3"\8W)X{|5z#V`_19֙Wz>_\`xY oqDo<W(6e=鷧{G߄vx|oO鷋(@ZY4Lx%Vqu`;'x^vF BWV䛐%?pBgw89 R?x,z`Q2$跲#O]o!|eˊ Gly{sKÍF.AÝg}L@\cŒ@e[y:df:LRsV Q{J!HG]nJa۩nHc6Up~U\9/*xt\iGn5(Cg>DmhS&pww[lZټЬO'fOdJ mɆ>]~ɢߙThbK,tDY4=``P,&i^!ɉY#$o(qN$ZTF|̲c²"<$eY-98J]WmYB~^0X e,% DI2*xt~y3Y){J?CJ)@9,7nь'rٲ{bҨ_RA"It}?fW/$baq7NjsV2v &8[6gB1&^"ŸGcc^#CyҿZ{O釴y"ĺ9n`>WE!(G,MQ,|\cirA<~gK3Y~|oS~aߗkH?;?вh# 272G eFjaP{ *-Qjdi/~y|eyW<,IsL5%H (Mk7}["e3;;nZF =lYA30>GX̔搠5 zˢly^%{Y\׊|[^;8oh'0%ӄSJ3O榸yX<}-Hpr s,f~$c$x3@~{ZQ&K5]3ASCR񘓀 Z(MVD .ݫ0Tx|A?ը/fzN6r؁[/6O?N>=߮+>UmS\"܊-]­ؓu%dYg'ηa,YyJZt3I^z|`LbHlclJ !BY;% x'Fؿ{%w';&<ST1%(^hIݨ6$'FO:. &\ԊQ)-D Ep" bڕN/;F060e'5 UQwμ3KYҒ] =.tҗQ*֮9~ Iͭ+;>|WYhÈ:$tRo2]fV넨߼T_uUPj||tR @'NeXcLB8FC b\m^zhzޚĄ~HUR} ! v`^{,0`^{k@qW͠C hҀN`UGl̀08p(~dbdn(-:_@9-ve5]󰝬[Z*{Jw4ͭw@j}1NZ鷧\%[(|x~jZk;~R"fsxz CKY1捪UCæME*iBytza*Y=e*{mYҪ6׾%ǩyE(nU؄W}A1Xtl1kWD;ѓ82 ?U^R<>i-T3v{?U6*R(@mS7H==鹼}F./࡛oY~Euos~%pxO][ r?X=RPZƣJ5@CjZCWZ2h.Ȕ@#&vntܝ8Ejȏff (J Y/4/[r)̀[mĂZEj“cf#s>ֹ_"A"C.L4wTxпGq_&䱲ܔ#F1 U`@>Sb4 Ͻ ~=_[f7kn5GYh2g|c ^ ۧ*~{n- HdkL}4I^twg_.ᐗ iĘYie(o)F!yq "-%uɇdqn]1ʐVOQ7H~I ;=[P3eρyLv vG$)3ĦX1pzoOyoߺ;/zK qMYv:04ͽC٨IdjQTF< lɀQr>Wq(Cہx)8ǀWqy eZעs**^v@zh,V]/Ea6?eOGfN9VAKW=ԫ* "HJ"Ym^F~]D]Nlky{#Z@:q%+,3U#_{LA^tkώ9quʇ >7 aոF@E#8/WqqF,O&x Vώk<;@ievcڵXDc6=6^ S7%lnˊܲ&7*[eNwșɍSQ@q`NiΒB]J.o[Puiπ_kg Vl/h1V V?u 6y9 uWn SahXOV]qg[ l[t`z{H|kp#(lW$ /vr Nz3lJG %5ycQn>Gvwȋx030E̋F*nw=)4H?8`ћzqȲQX湄n1YҢCS<_:i.Pi>;Et֚ٯS]ۙy~R.Xss.)*BD%d}P}~]!ݢ7bIQ)}lON*)%b#=&;4j8U_ 99!8ƎOd_i0rNo ś##'re1/;-׺9I/~EfFOMoY1<_B][yJ'A(B nI IeDʆ4ߢh= pjqX3(q![Sexftǜcane[Ugct/vΚL}@_BE =iAW`/^ nب)j ٨Rݥ/虁(Yd@:ݍ52 x;?k᨟`CqDr⎟S @᧩&vlU3imZIyK۔| Z1/~bQ?ZFAwƤMi SO)).y"qHf! G,htjE̷,R?Z@> 3 p׾wó9o۳fi?ٶcwVZ^3^@Nnol-c3}SRw{~{Jwi<69-ӑB萣sѲ1f@I|tTT^d>nxA,b[n]jtAVѦsVMDrne7ϸjOUc';Oү5bq&fcO6h,j54KX3$g=pAok25ԥv$)iUUDGФJ*E[52ۚ24NefGlE2[M@cR֊ZLj1YƄ ;\;S"PJu~D~ak8ECHƓ4Vu%7V}>vGJ*Ʉ_ii =+٢ kC] l̪dXr˭{ws{b_`N7oͳVۚ0RdS'8)-ǜ.cF@rE"F,ʥB=̪͡]7; jN(Srr"[ '13bn n34=4hGዺMSa+(2p56:S4 m8~eev{sV1RAuU5a*͡YwrEkљ5bo".S\]Xn3pNx=̵EmMEPv;f6N]x˛:C١ ;0fʸ胫!؟+it GMY(cpxHQw4Fw'-Fy(Hsno?$L!݁VC -k9/P)I7ϰtE" =opua:a>p;ONyhuYEI%z-9'd*;HlO[xk-3%S9>kUhi+b%Xz&Ս~ Ȫ ح،ZWjEUB36} Xojn߸?-PDc$Eߞү}9-Rvu5?WjmG~ݗ"Bs5GA_2)$n~%{}'M-#c'G*fl6ٶNMk-~*tJ><\oGu|={?={~ÉYc8ߞe'{vw8Fx)6-rحC*ofLsnJb8{H'V sF5k}}=.PJȇYc@UIWb{qʁy='[e޼xc#~ \3^ P[iDw@w"QQ3ŐԿ~;W8<(>/.Ŭb/z)[ -91z 2) LMUE-iI9i8K4uJ*T_Vۑs?5ShNh0ò=1'TeReOfe >ʇĥW(x}M/M3G}IUڤE,,U-ο=5"S5u9-g&3 P w~WO)ނ;7_n~o_S'F+$RI”+1HF^qSTnnK`(V^F lݙ-) B `޵J5BFe(?%vYV*_J@d~, IȈ(AXEa(t oDٷ$3)kDYSB`X/!.HL>*"hJ!ʏBv@K!CQAm .ܕ$| kմ-ݖ_\$,k `%Y$Y=t U?]{Q8˵*N|Jk~">R~hND tT%ΐSZKmi"JHPcN5a $\$;tk㑄^]"iʹ_[.+ ӷ)&XAK&Duf& ،?9l )<2^[JƦڤ$8]d2j nCC$g.?=ԡ)ڂ7{<-&#}Hlz{`qD嗔ޯ#Bfϻg2>k~*7SJrWXRN 7{$M<3c<{^y;F-HM0S>b\wNEЮQgԸLpa}ݢD؋0poɹex \ý#'>) F?(%um{yMlK6^V)fkdh4%'=<8Msq 6! ːi 6:WG%\b|fkC% )_ao}a:l- cm)tkN 8Y N-=E %fVS"A\SAAV,ȈzB6s{w#s2FWsEӑMw֪x޼%pYCRc/ 1. nZ;x4 krS9oق#.=~_Η-]t !yV,ߍY*Z&t3 –OCy0!q# P#Y QD7^C,Kz` vXMXt2w U4Jςyv-Ȁ^HY(AR᧘/1?`iӒO$-ÄIdIb-S]~@'D쀬_o A)$t#İF!H8ӈP>s흗NTjANH$E"P`ecK8A_dE/5+uҾe$#T|6ko] ҂EVBNŧ %|*H-V)@neдlYuȿaxyʶ@y䤉sL"+%ahzSо?%58,dOFKC1R" 9 y#g CIuQ]]=7~:5cH1$S}("Q8cvVU(@uMۣt.ǩɝI2*|pWPKq : )ۨ4ZTm;u$Qi yIdPՑTkOmk)2 jYygdy \X$*$/@E+k;Q dQTqgc@~a`wb"[6Ե_$]zqUVAsE v ZP`jDɫO z8% Z:KUQ փR*g%T/SiU"p4oA)'U5襂E=?-F#ƂsùS G)&h|:g3h `'[%O}%$]Kwmm=03h `@!Aɵ2JE VЩ9!5w": yTbv i *̨HPD #DM Lzw %.}\ bE;,O|W3z 7Hҙ^MhgQ@ 淚~%" E>z%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쒜4ʖv1"jOR^`Bf6msWi^J Ԣhv$)h'"~o{xkF{.9Z8Z fTHcDźBYa\v8=|N{4vq6_bu[}*tش,d'G ̛̙VT,Dp̙q,~BŅgN4 ۽)zg .S  K|x^QsEa v)^v[fԴ0O0 L@`D'aT}.)?QTFk.-Vju^X+R*V ]zQ记P /7H_ǯ.Pp{ Sp aŴ$84;O%P83 'dq~'JD+ia(aYGԵ_lY!j' en$i\!P0-[1YrDJXH%q6q,%QVaU~Ij<\Ng^|%_b AG_E?o|v=t6N$qu!Z-:fF+|PG?2 _l1Ɗ /+atPbq؋Qr<)`m8Y%$J #412')-BP%i#X;fu=ɇLR" ))THʓ*_ʗ\bADETXxXv3h `dc-]*Gn$g(BT  $|2O,N1҄@Mg  ~FL-\ASa`رYgzmwsY.D?Ż 览q,3 QĂM 阑٥^[mi97!@k%)g/~rmM4t:Avb]7"b}x&RR#(m5-0bASU.A1q+X$W>wMC&8&r uL:F oqdT,2WNG$t 1 ]d#qN ƿ `=#f<ޯgTp`krpXn뱊v1چ19I & Ѥ+$oAb $HꉤHLK=ii9$a)KL3, #(ĵNsY6ŜʶNu_ X%°SY"˿oPR-~]׭%|'ZB$j[Ui5 4e(B/m,0+?s kAVarG94o aY0]<"kO0@ܻ6Y1ՊZҒd>{O. "E$fި R WZҲ4yK(?5 q&j 1hH-fazX}V%X-c 2R$WF'i<㡌awZs³a$}a"H~vei/ٽ|M~{"OO"DN@`E٦eU. ̜彷(<oLXQ]ŏW{,KygMծaΒT.-b@#~swK qH=Z73yHCv>asd28 +R{h&D"]-W{B˓-IL S\@1-oϪDO0Ջˉ0ʐb3\A*u{g zIvBb}I0Wz: ox掕OBԉPp%͢j'bSL>Yuڦx*Svl+'%lW8x0l~LӰēYNhpS欜]beaLCT7Yk4\+BK?+:Zے&䞽"#6o\ϩ7^m `_E+BbMD3Hti%&J 'J$zk\9/Q $)DHI _j%JH'TP*EvXS'H ,K$`J0q5' \t.}sly6=A8W8@Od6"+}i^+wڍ̖605 fK٨6& ҷM[l>sYagzq;:Ic`h0$Py&;nf~KxRN8#r lk I(~e4b{g5O; ESe#m~0LxHr8 ,eT' !~etxd< Rxjݩl _.~bZ[s; XU[DMg1Yb,F!d܈bj6!,rB$q$p4*:L$PCGL aąjkz73mZ{~Eib>6{DbN(ؽV-nADpYyޫ5t-E|G&%t#Phth! na;Kx̟v1 Q{CA1$a: -M] s&)cr6-] J&N!VS@Lyͱ|nE)*vټ]1-5ϯa,uikS$tzӓNumSe@3] !y%}"Zd~6:X ytYAדg+!+ HOS@oe<\a'Q`^4|Hvߡr,1Y+=B}@gܡCgڣsLmGP&[mE0Jm݄auDT: ǧGoRFZbhr= (A)$#Qay 6v^?0xzVK?Da ,l.Fvmk1}~Y_S_-mDYh9JhN}؇A(NotVC-T4#wgҒYJB$ED;C2ծ9<:;p]^:o5쵧^qm잟^0z|B|O_4}PSj[!?SioJɷ(kz-u` ܐ3 kA닍h J3G=驌"޲n}ʤ|E9SQ^\J`z[^}(zE?UUXSXȅ۫m"I#LN6BYLh 5-E@2`9%'Ȓ ObB(߅2:C1&jTO2"A8X `&.FwAN&cwܹA }LL]  i9Կ=Ade+7RP˻$%)߇~ hx9^/^q&s$NX.,< ][$Þt, 37 Lik^{*#>Ϧ靻E@zXcH" l<:+"u[<4 Yqd4*(UXL%X\7f䇯Q,8+0f>>hYݠUuM@a|Vǔ1=}b&(U FS,kª oz yAs?|;9Am9$ 0Q/=8EۚdtjnVOp ˩B5%+Cn?nRüx$v~W,0E $O4)+ﯖ \W Ӽɟ4F3ҡ[&֍1{3ҚiVw'Y{vݞ0 6Y,. t,صlْD'HJC'&OGؽ!W{S ,Ds 1AmUDin֖;;W߰.ks["ٖ$&8mܾ;7h/j5uS-| iЪS 0 `VM2g] i.νzdX;\}W&(|R") `aׁR'`YeYalESEhhrĥN 0DDO֋-,#"uBU'Kо$w{ꚵ%VT^J]4O6ѹgmG^d,xDXv2afit>FHaH$&9ǟgT}xQV$rzGyԪ'q2ZYN;ic0pII.F̸,Oi3v\=q$}a3rtB$kW9  D=AX \HVc]rǾ^j `xA׏*/6Dt&B8<>6HƸ|+P.r+M i0VP#Agdfj`B)'`Z&E/2eXPI.!Lq DH!]D/ӵ{L2= ,3&ni ?(6!O*)1,/d!NQҖ~C&fvvܷf˓X^Ncc߶flL[m$"j#:zI ɀ|'CH0#$A-{z;E@Dþ-8<ԭdDyv:0 `V;v]Sy 2Ϫ)x%TS*`As)L0@:ܓ#X=嵪6kUDKi;-Y4ؑH$01䉔x剥Ue۷yj}}-ʤNk/{z :&m'3-z>~uZ3P?_qf(#-]>;6JɈ3B`sʞU{3K<#}E[w^Lb#{Aէk-X=\ahk^^ILVL!ɬe]Jt+͞Nuq?\VIn=)0 m{d(xSTy;/g&)S FhdmJ,srB]]]anݎV5mLg-cCvjЁfx5 `Fc9 cmhW|9!%z;mpCc}\]r J,x#ȸc첚 /_’ {Ojl:=Hu[vBO!I]tvB ~UaÎ/Kzj[붯z)Pq,#)KRq[j6MxU]HN(ߝjv)<qhW.k$=;'w0Py῿8l_`wyU3gU,^|@0^4%eYڲ[ͨi+Ao `M&f #]+\P#[:H~|2@thl0UB£p?$48BI!Z?2eӏH5c sGѴyӪ-sxtxb~`K07+k `w(mܷavZ~ך v`@Af'kI.i'Rr%g`dC=yE/8Vxipyi+2sZЅiԞ0}$(ʴ609 ڪ:OZ 1l,)att^N&w^,T/)ׂߜp,;dqЮbuշ3ika'rvԛP" o:Mf-mH *.7<(滾MAC*~ iY(.F|=#=ۭ%E[k&哜UH`oSݓc+0s:]KrڃIQ$4Wh~ZtT+O*."UG(W 0Y(< MV]829R(!q( C#=+ !.'r ,Ah˙TA H>X楷 cxH\ܛxp:4֖ʊ2!ݬ%Wcca /F?X=sLƹOe*&c}S;PQ$̯YKEY-YZ:0 `v?3YY% cs4k'ZV?D~Hd_e@[cjҭv@%YO0}Bx{p5O2lj'\ >2臈,]VIӿ Ï~MyY壟a`0b5UGM'fԌݪ-=iiيa K8()U^= ח_KLbK(d vwյ`'$`7S)5+s }-5ؗ̔Y "4m=RrNKO|? > o.yfBq=\A=.%&y,M.ݿxUyU nPE&헹XQɔd7܁~ˋzڬ6nm[ X*|Af?$~DRؙLք҉Ka^[[JXА䣥%4.I;A`@]Fe%9[P=]@pm-SK !~e;i <08 Sh3 t51rԨb$dV刄. ԼĒQ^ζ\/6#tB0WNP {˩_SfZ爵, ]@zQmK]WST$䨜{@IH&JJ+~|z5~@Oɕힱޏb$vj D-.5nif?]V$`f~ 8_ih_BQ{3.,)ұOT\ϡ|xV>1#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״^w2 W\Ȯ2?]4u[1~[oLj|{]fP%=C USPܯ%F-.aI 8 ͸U"^Kaa=뎝@FEl%P=F8eNqb)>7XCsۆAv?pNl]Xc~)?eY]F_Xւ^4qvq+NZ=tV ^WGsBaN W8IGtNp3!p)N= ϗ2Z5~VmvߦVv‡ WBzvv6 +}QӾ%,0lܶH˘ uH`1 _<~EշL,ع}-!j@O3,]ѕ@*\z>\?oOбBJ*V q7^WP.#ޗCSP0(wC U' ס ~a`Љborh4 \Xj1'O+WI~g'(!r5/Ļ8eqZWQ&֒j&reS$/3ĽScK˖ݵ{Ԗyy]~,7L̵{$ F򨴲o[vsاn^}!4@t烡: +HY͒rTIьP nA)M@CITBja} Zٮ8},ʸ_e'uN{TT-?~!{ENX yl[Sۿ:<֜Q 9JaaRHlZSS6hJN8u)0Y]zˡKkY7`j(<)4#3>0@l4h؈lFK dQ*rw>Ow,zT=p[ ,6p䐺:#+lG8{) oF?2P`ynmVL쮍DiL( .IE8uCa ~QܭgKaf;]OW@ή~mBhc|$ ah=F[1dI8uU0\ۇ{}1sS$[t+]Pt<0>ee!/T/z)j/w<5h RÄS7**Od*OE\W\ZJ?# R^"*&Z"Wb yz&M +GC Dx%KS̊}U(NXWα;>O@s`P !c!jLƈHzgd9B̪8}qfC·oiAf52OSzbj~5"8gp=L=ZpW i,kڬpc^k `'d{z9 P +\ov|+G_.]O SaOHt5P0^b\eӟ)^L2F)['F+dB8N#aK4qZ9-&qmܔާ}HXaXak+"O39OT$)4܋^h+W.EJh `^*Sv%_ծLKTHnj-cTj竈[pS,SNLQeH`! zF]~^0"D˃(D U Dž܎UzUHӨrE12A i=%0Rd }R[eU:j%#Yxsw5}~83SSBjck{Du哼]{ )fd-4`{ `W~rVfXHS㑘ԨQg0Qy)ѷ 1y,:ˮ#M8+3/_iVVOqYWֵX@re3ۓ 1sm|T2ԕY 䯨.8cX.\ \%a\ oR/=@Bէ%:(d!D.^}E GBh `$]EDe[f'G99DW1?£A6Q+>PSg؝w)T8 1by$bjQZ~eϜV/hc/f"&qW^3e+E"9ˤP"qo͋(BCv=Sまfn-v-p/P& 2dBF'vASϊCrF><)ibk- {ޭq!|Ptט fRt,SSG|[bE.opZ.Zlvslbdrgl^"YD7r;&i>L)LH/m,%:\[4 wmƵї 8{i`.cD2˴5Hw ^X[Jƽ~.ow 6Qq_@^yEr`$؋a0 oQiŠq9O2QRNۘd]LsJe̻Q CoI}'QdtӐH8\:]l8YZ&#U3E5idz:j́NW[ 谴^PjSl!~e;{S *eUƷ4@Jr"N?#.@Y#? FqSx(nJ]prHwjyȧp fpv%* TL*fV=sNܤ%-ӫM T0S, RL!**I,W*,>ۻPXL }tW*BRL 0#!$?=_]7ojCXOBUصm,4vX? ׽>,L< YZ`\I`n5o t8Z`2U;??c6CvHn&Mϊ_=WN6ԿxLUS 4-a5@-Mk !U[$+3KU剄0)ocfkPV)zo-r7E[UCOd #cx[:]#aKQ_)01m%wv*ǻ&/LȦ/ K_l̒䭘 $OPA ,l%f[;lho8򊴇K/8P6CTBCNs b*ӒzsP9@S0a#ӐC3Qo `Q;nw&Ȕ9:vq0 { Mu &pMZ|JQ ̥AGi iv>O!pyL 6hCAP z;wa m$R"$$*#X.1m.A~,*Nt: ުZ2D\#H\Y}`=M'>wS;Rb&Hq "2|~ۇ߄>E!ᕂ@C?D_TƖAbn VľuSqzu2 Oo 聊fȶLi7$';[ٚrj3r.&~vqwu ]g-+}:s˘[xDݜk `1iJ [ܚn,FIDQz(3>^*և2|ή " !(WP :mV(E;Ci3oq^)-]{A"K0 EqQξQ\ȆQL& Døs9+-*%UT鋱4O|%,÷A ^RݵH( n@{@щ"ٕN# *ɥAI$eW شXƸS4+q(m PEy@ z;Z2BRi U]LRKR)Ft,f{O1(,MCD"DD&O-F·s)[ .%e@Г93!Z3im~oS\ rٗzBoK2ٮ!|8V>Vv`e$A̵F/Gkg&:}<|\_L9}}e}IxĪw;)UrD9ҕaQۣAK,w u&H_!ddO X kgjU% DCZ|z\[f6ML1%K5kyXe,a.r 9sh `痖i6=&vGs2Jk7~<>yC!]v t_sI,ܫ :QU=h/ m]^Xn tʬ1 &Nq Gc+BNsKqpicGmϻ\iY@P Et)x$LьVz6Qsm۝ g|~uE}eÙoS]7z0D!ҎHdF?D1tj)Ϫd Ŋ"`^'wR.U/w+TI4o{ ;WMbf ˠ6ҾW ul~,de)g!۟j+^4<\7 JĀ)Eۣ/܅^-¿W7g`)x{N[ \L! aEWك)@?G=xm7oh>B PE$y j~T2" eGɻn TD[%QIlj=I6lkѸd#)%-<+`~mkڅ3/wڮOʪl K+lOG_C 3t,t{^SBS–6b[@8V2nW  d:SX'bD2P=;88wAxć8}9|KCY&sDVAO#?f>͐SC-q}XXݵmI(§*lk Te$݅vW)UMM 8˨rk\mjFA{1½4KXt\F= n 饍~e3Mnݾ L{^Եfmpm%T"7"dnv2;oyC.f$]Ʒ c7ڡ}Ih+a]:A Tj 4़\WW)3' ^d@Vatr5u VuTF^}]dbsH[8<Ʉ"7 tvhlJD'@y(80x3]]8Z8&Fn_J-OU?Q`8ItPuUUj bm{~0uq2v<$)$];Tygejbs$_5%J |+k `~zh vMot2C} kš7 8P,GGog_B>e [4bc;ڂ7T/A:ZEL*J+J@b1Cf1zA $ j#ħwia/,yue|۔|;z؊q՝ԍE[;ElM/o|UlEߨ0L l3jw$BgjqNT.c^'Bʄ}H+LyP3agD rHngN"#f[^8o `we6䱦d U4J/hR53ᚵo-;V|Ha}\*NByb]pk4tץ_=8#j-Qw#j3;P>0Pjg=t{8jԽn{A|B@zX^=ۿatznz˗ٮX ,t\x(|N\ӹ=4k+&qPJiIl{>}EЧ2gם$M$ $u)O4]+o6Fm$LFj^0vPa|a;d;N]:6&qryЧkiXAE8C4ݽvO&E/%Uzl7Eb;n,2Bt060cj"dɌúT^ atpv!ٱ$Rc |xZtIp6QqO BWJpa1R:_g+2듂tET *X0:-rvin.PJ{C Ȱy{)Ja b޸W|y?)sawӕDS!qX 5Pq + O` 4I x>Rc\BBS]Y|*1jX.ɒV'ըk"hFz2nu6m."RhC3~N $ī$Uzn@ym9 /MvE̍h0cݔӟYO}}+P{P?Z06*f)$-LڸE%Lb}!zc}ֺ-]DՏs^aP=}0 3AS{ `Wov&bfAmh0ٻ $eB)gY&3*W8H9#+z,!.(cE͊Q5ر9G#D6߉q#N 6zX-pkeFL7aX[e8s ▔?GD=Y4S`ХemEhõvmZ:u9L:i\M^Ƨ V-ws(Jg_J] =+`#`E1ÒD_*e5*NxsȮcjg18fѳ'y6F"T ̂vڧ=q^<(X$.FXҍyRwD@{>Ip԰?bzmQ#ҳ$)w^u[3* A"LO_ p)")a*G^ tge[5pMI &ZQr95#Rl99F~9auG6NE@*[dg"8_ 𚐡>b5P C*ʳ@Cfnxbsc1>x{ikE̵M72ŵR;#ŶI\A1 73_3t,إXQ ueZQqF?2]z׺~~rRů`ܗ13O 饍~e1R\hJ݊oӬEFa[[^YcY5Yވi4>Stj][;8zBfمB8(L+DT b`k^h#g *1GIK_ԗ:dWpq'g = X{8ZnOXtwMc+^Xf$>9^SqcOzRB|5]:*_Z1hze%2^V=SS,4e$ d|B)4J>/CkξTOg[x;fjI/bp)~ցxr^3^_=:?TR+TNTfߓǜ{ zj `tuP Gձ+Ω׭44K_gcblbINJ|w#KDwDkNpՄO;lڂ7{:hmr*۵{’u)'_r&G~SOJH^vy,OX5ΨLT{ _Ͻ […*{v0E;Gxw+M !~91̬t|h\UgW-)y-DO6s TP*CzTL|P>/70۵{>@ ņz1.4{0(H>4mdH"2CaQچ"dTk޾A󔺄XdS@.>44աGP[=|;:5ɼEmҩazT.w.&j:891.zZ`Km*[ĺ'iXes2 _tl=ZH;}[vKjdYo&g)Ƒ\ $>8'/#IꓽjFW%dZ&:_D:&de 1 1!'Ko| 'j{ֱ}O`ؿɤ\yB@z1\~%{z؞j `Y.1<]SZi}~|X-~?3t-^P |%FL60~iP5,2:=T~ô[x;d7~fuy->^reZc|\w:$n4{ 0ߺߐߠP)`"yS@[ӯh5Ρ5{qm;,$f]hl^.$Xϐ(䗠r-y"a|XIdO-zײKm$r4DxV\xt_ڧXgjc}bVKgmp+ rF}xXwM s>챮!~eL(5t&v><s j:]]?5;tѲ wڮIeȟ$Uδaz/69}IV:vIldkV ɓFIh~YF²9WTFW]֫@16l'ՕA7e}Hя^3`dkBv|do1'Y}$17j̐LX-?]]!/ ,%AZN*CşJub}P,+Po^`U9_$D=>…hݫs~^evǫlǺdѿ˺<Ԣ~g(AbksAt5mdg)`'o)v%֔o?td/'ݞ2CCv`qk[vØg  `'ZkcEFOK *b' Ӝwvn0K?bHw8D"m0:=j"WMۖD'6r=EEƵ{Ӽ-8G.Hﲈ׸.paf9z)\LVWVq43>UP҅nGcQav$-vrctlmL`kと G!O1VNZi7V٫XA}6SbEVʠdk2POIo `'a!jh*O5 Tjl- 5#S*Wfhy/.IՖA;cG|XN+qQu7'4 &ԡi~p(# SːSvLimplj"*U?} &5Y9~3_%ۂzҌhZJb N#@/8? 3sC=jmfØ^q(Xq>' !~e`Ec5yc2' \̽=iǿrڱ5QZ_qWmf?V=>D{CFI{ =E gDԌ `~E}fҌ^S5}y>@(f5Zb lŕRF*)(ݫA02Ur[OHq6*ڸZ|ݔӔCƅ q m(\`hCg ~1xWzQϙ%β+YƝp鴜t:.w_27 Fܱ|x#tN qߵןW* XQo &R'| ‡6S{CT*ɰ~mǷȊcb\D-,dǤ>Uv:o;CQ"^qyijE{L&, K"sz:yi#6 =tR{|:l--hDKN"Y]?PV:H!4 ߣ|A]g AbWR:$ĊIc9i+Co!'[=o E1OE)J*喬dy'yꉳ{Ǻqo[ot;xS[A+}}~z1'|Cw_oa/'U[;7mq{/"cP`e]fE(\`GgF&ukg:}jK^hUTd6̖bJ_b>!`{X~ӄ~y?D[spRlM JDM,O@ !TOcq/`kd?z{#w8E4eۄ.Kk,[jLGz%75]j>LX ɂ)~"O =_#J?] }cs|ǀ7xC.]H|ŏԜ04hl>wCü)COu^yK>GG!!"Bh" BTZTZ7 |͑f%)J>: nRfi1`t^׌ϭe|938muI3A(b=64ޔNL: `ߐ(7O(12@|Q׋Be/3?ң7uk ALŅ>]0%N^:ZNYj4,|ШbYw Iv[6lg|(>-o~ɸ-tDis\<|ZyuhpGg Y*$"% $T&2L64iKig{KzDf#wy;h|Um Oe #㫈?S-^XR8DR<+`-UES"sK-xIţkHXYX(@i*W8BE%oճrKyKkAOHCTKif(kJz_N?n_v\@zJ@f'-1e OϙꚆ^dN xEScQCIe/92 4@oF1_*,rI=ј/#t3q\ky@:W01ʞ0J\swdr[Jp3Y½\!?ydql5c3_88Ai cڢJT{}!l֔V}yZ<.eM 6%m$9.."/KiHqZ&b=3~&ߴ%Y#@V2!kC):nekzےuD;_;9Kvc7ní?ڋYQ@ʦi6+mGNU k &GD&w$2m!hHhȏ3"+ վdߤyJڵ%FOXP⍤U~D]+G#Ϯ j1|P%G@{T%~j<cxPT {J'id^Ӗ^ШR&8t"U7ox*M뜭 )?=Ys;-s!XEڥњAavӄZ9~Xr>qkUt3qێp[: Qvߦ^L|v\K (ܻ`=}Ui]JĊU? z_ S_rάi>4oQB:Z?.`{qA a 1:l9{xO ^GԯkKWĆoF [%} \y ȰXh :;fxD&222`-[~utQȿ!e  L_W ӹ/Fj=VcG8&~"0yتlwz@zxd %K_7"M[g8MZ2=YƦ"iKW‚|b>"Fj*rk0ebtjB_%1L[jKZǴ/BJcrH@q,9r 6[un9䬵*mVUzY3y WxH0ҵn8R޹zj& e3QVO{iz彴'w4c≾.¸p5$t߼:0wf徉Ǟ09,76V " ?c ̎ʈܯAd| ކL)G4^ըŻ5k-h #W-1~Gҗ#G3mHIӃ,I7_8]dr#-JmK,e9bR~̽-cfmɺ]yXJX%b,/ڗuF2 jrKSw˽=i_2KHPaH2|YCGo՜~fż4G `=W,i ^HOdy X< ABgeNC^L!=\[>S>#y^bAx8[&_Y֟|uúB@X'aq$0ҨI &4I`,rRR(,S#kZf0߶~f?rHGh_-_X)=Ra#W~!-܊CWvdHe)E i-@F+x1[o |i5SiKWG!D Dt ?3l8?]l(L~ KrZj}ۏʀ ۔>ԆڹuP+prA l٤t 9X rY}[J*z++$ǥ{E=G&F ~̽Vx\9~!Q,ڡR\}U=g?;gb$\@\@pN0x2JeדEQ*AJ_FF^9yúzm&ʿ1=d0Qn< A+D `:_>;'}X^A|y-ّYG߶Q2ry (nIIy8e:^G9ɜӆ8r'YqXQ/<`G=ּ4T1\WŞ]-FEBhY%L5a۸!G& ׮U5-޶DϨ/sI"0}iq !krUOT2wwDafj!_$Txq{‹_g=$KS<)G|ϞŰ lqWP)W/Gс0U[g:RJ^e?`Ut1"~1JJA<,̤S0[@=9:g8+fJsa!DjFG9CV5+е%sŐK i5DkU*go9Ob;zfTBXD1Q1`DVo7"?myKPmeҽw,!B0_Yq< B*'y y~E*f݃pos@Rm Խ7t dIL(Y1h8FsD>w,*NiTvN7*[^LMٰĎI7 OP֯4yAiAVmJ:x{d6%b?WR,t>/^m Ä}~z Y>GRE-_}Z p?yaא_ް^ cԕY068R6?:K].;٣UWggȪ⌟9(_ ů|L[jV x}I͙Z]' ڥ 3E_ 3<~"zB}.{i^­ !h۞9w0#8&pÉ7zYJ iKxCv8#hC>GXwSs5kq ?_!"c2be"rC *zڄ~3 h iT؈po"gݺ aϮضqt(JHv_dݨn=d3?}=qg7VDr>mSma:I?va4&鵞0W0L-|QM K>hGWh~eQ"F#8&p$.)=LIM[ eK `]GL%fq/zo˗o0|̍W59UJVZs۷%Ω#"s| Lq4[^{Ӗ﵂+Z< )mRu嚸#7^f8Alh ..Zy0VEfZ#cs 3~0dl>)Ԣ-#&B1gV_PgS7qȈjle-vėC(v#X;mRi `h_lWZma 1V-_ڋ^Qsښ+6m j`/ \!(V-q"6p+kfҋ뙌:ޯn\,%9U'6M-+Q /َ+Pqmg%0HI6?^v G\O',He2K ]Cծ5ݻ`mͨ *p 9z.V~$м{3p ?d;O@>Jl: sG_7g1&>|ƻ(;!I-[؞m +iݶJ^7bQ as*1 ,9~҂( =tJY"7KʙB7e"+DL7 0i-mびe[m BF|#Y*9pM[?^e$@82^!*s((i 02F85=}IlZ?QWӖYP3J!"&:@ '!w ӡd|a&>fGqP[ч =x뾻9êʇd,5MyI\At$G \FOHXFw}2ѼoSLifrldL[rq/8]?R5W4m }^MO`- R{*Epy߸Ƹ<}ʛt,o RӖۗܳOӮ™z1f.c`p}8~{㸘E ojkd^O@im=lOlY8 N¥c?C,i丂7KQXK8}bw&;"=U2.'>a>n*p/ ܎+Pn^$Ӣldt|w7L{z5^6L/(X/$c`yBe lda@"6!&M@FMw)#x%1 +#jPflZ`$d B\=@W&Fq 1⁗XS&bI0(mJो ݅]<*a-0`?m?,.KM_>GM^ާ^J1awXO> !Bf8ux{h$ah sr̐a|}ooet]!g?XʏYaD{ONƑ܍?̱5[;*/Ez)&5PTejdH])bn(G|($Aɾ*,OD´ryЦ-YғjK1sԴ%V(<7.*:;M[ne <8=H.E40ajX"ȟ!i7 .1I|m+?{o۔KNk%i~0K3EL×XPOnO_kRV) Ӄd!uPɨ t@tL%hTORcZUWXDf~TB O$rlӞCO;oK8䄾!@Hܰh ݕ>%iz"um!|3~lOaE|2̧mruݳm<>ž  8hGܷ*=gqMQRǖ[9bo#fU9L0VXEW<eSzURbuwDw_=*+_<GmҤclL#Ȇ+׬p%b!u ޸ %MȊPO 7X@~;oOyP-ޏ(xΘ6ݞ֜U\V5hCB%hjg,]7sؠ+hj@eR4?B+ r6[Y\r}zi[*1r1[b9qF_p6~M$[9'[Jj'Bj(LL<{oɓ%+3{WKaThƉ?$aT>4 24I7]u"@,CՋY#gY#@u7:Lm~;MYʕM FGsӷl9K2k1V’Iq.eE>%j?/fv`;2X/ާLK@yFX ^H# R) E qNO oAH;Űp4GP0<>9G$1K,:zO%˂630}y(OM]EK>9E*z+H>` ̎JwG^w^!:GӖF׏0:X?X\:-ŝ&2i_qwVBo-$Or &J͎߁ &HZ~n LDAh>;vzkТ^dk-e8Mt{òb`:mX j_4֦-_b^b1/R-Dꅕ־oJdniu-F}ƅ]"B#epC.0 R XeiBp,zGD(#>mRm/vY3X\?d8O3 {A{|蛝XPqbvyqr1m"eƉj[#~TGe? W-yyM/Gi"͈0#1$~-e;ng7+-;nx=W`e .Q½Ӂ}̦Tk N9Y5 }`mKWˡT㯘=UqʨJ]V#8&/P)wvw7-Sսcڲ܌uӖ̈{CMސCKZ`[&b]W F"l M|H5/ƽ$k e@ [(6?U"Vyd5:L9%ԑ3A{7%oT-U=-շp}+J0>lC\{Dü>kQ~PoQQ!}}+.\o,7WpJS'.b#,.B[v:6T:zKt@`y aUEmҺib܎gm3Q]cet]!g?n$$iPs x٥K4x!y,&%KKY2KE7mh)ЌgY0~ը-_/=V d/R;! [O%5%ʿMIw<MCIc=js{}_ _OT|(5PEX٢烚UI.\bp<܌[3T["jsO#ohdbG  Ŷq#UV7pY7,Sqn;#]G7I!3e\.\uڶ~%eXȫ$>4,ƫmtsXIYfl2m ;G>Q|8tBQ 0u=9dMq:!J`> v^k++߇8 zi`%e '#F.8zrj 10{ʋ,s) 2J3#1n{H<%ÓfxI%&tXB$D֯_D|b`'"-ҧo>߃5mȻzQ#_}P-)q"hX/В1 4r+uc0Uoy汳KH^˅G]oziK71lu͏\ A2z.1Y~Sat#i<*2{ ו?$ ט.@ @?#nmB[,W"%>M*zZvל:3D|S W|z>zM, c?˜dvj"K@3$gK/UNvrp#5}Qpp؏Dͼ2tI9x2גY[j"0UDYzEaQًmv0,fNnGYq!;Sr/ih9z*\7C3LIV߿p- pK+Q|w^&aѫߨUoɅ϶msYSsXCG WGY~;K,qhٽ'۠W}dČ~5o-'2E9ŷ|uLuݶx uJH ( ePp{T- z[8׎Z:Y,nV֐E[%b]GL7~&D+#} ӘXAM[D!Μ`- > zl;@5`$'|'Ա@ZٯdֹgA[gi`AiǤ=~}1}3< q=-k`Hjgp7MZ73vm&r||l^*)b0c(1kcy搻:+U GDBmSx,pdPF߫^V"iqsYɷJ*z:]_eهsFЖʦh\OOV_惣& 6A³Gz҆=.#S-S}S`q+{C쥻7YZf|痌/fiE*KABU ~Kvѻ7M2xN;0{z޼S6 H;~~]Ym.]?2gG&! f/*k=s_:sic g> _j?:?f9n(HjKNۋHoQtt/Y/3gHJx֥p$ipڄl;.ka)ѸalKZYXE)Hu3D%mlgIԾ-}Wg('UoKz楉zOU(<oӖ^'4qʓ"(t{(8Nx eEG,kD2J0z{Ϋnj-nS+J/\2ߦdlvOG[(smAþ͐L!#.j2R4UeDŽඍGg[U侃#,,cc市'$BiFJ> -?DlQ*bQe n RGe +ߩɾk_L t ke?3$"-◣OPǎ)'5 u;7c8;p\zMS~HSN3!>yEch\0tVYDmazN8a 2s|]U"V{~:$^C:z%+ Z>+&~qDs !)XƆΘտvr UTNu˂:ę]`| =mKW` woJ_x`Ga%*D=XӞ8Z:T jFzhFmJ։GYHm|KOWȌm9=ς}Wm_1pJN@aGwӵVX1X ,MIlZt5gJ9M[?u;g>OF\0rۼ`&EobNc f1 OClbr !"Np]8_"wB ,EXѸh<[u( c ? JuƽGg`FDbcmH1F<%RHe0R4evNФ.YU=Arpgay +ܪmG?TY۔KW d<]s0ʕϙŴp{Pn|ܒpٙ=ֵL23_IF_p{򕰥bvm f]W)#ְgrb g0%KPٖMU(r,EAfq81v"(# ElǷ=!VGVl=!`u)+I-R[lp[8lTh)t.M팠Ɏh5^܂|ubIf"Y=w4|nW > gP[7^jI+н~u0 Ȁ1dlh9풫iLg-Rz)ݳ7yzʓә;3~X,EF*#(!Xxx6+婁_x-ODeEv=T$#F=hxaO$k?f{A`SLkmgQw/a-2p_Jrveorbrw]j3_AJ$A?[>}S^3?N*FV_Ae:H[,~-,i.k>wq/[(ԋsNK\+oxھ3;xslҾ k1auѯhO3QtMhʿYPOب{nctPs3cJEe٢V䆚lL23޵&/+sԦ^s6-tJҸ-Zt%в3~x|\wțG)'Oͅ\^Håa͔4 ,295 \aȸG>a_5ljRS-B8 Jq^mKO6-׶K>" a$r1= c%w\!gŃ pu~CU(ilB_[~ D{dH81O|JdN R*E=ԀJ"Z%b=GpLNXmzfAWM!YrӪ\:+s &t/S[%b]GLgOWEGOU6F_bʃiHF wP _{Ao})u?h5K$Q+>'$QnIu#GԍjЗCw84m ޻rYKn(_ A؃ U 2@N_'@q^ZIU.DdHWc݋yk{u:ec)&8$KlH^2Zަ-Yzޛ~=P.-Q! Gpj0xA=d)4UɹwvHwZRa8rp~pr\qIeΐRTZ-sBڰ~*)o/o]vFu/-ihܒJvRFv9/Iw9WA佑ӵgmpv,c=߫ݦÞ GZ, rOߴ%3oRn b޷T{TPCH" M,=FzXZx< m,]!g?rJ#ERF ⦪4m&x ]Ԣ>MJJ 3v>G'7(q@$ HH8t`0kJ3,SS!8QLAIuF\!U ig&{5BJ*z{Rv\JnrK2ַ%ff֦`˫l)_!.31i"+E< )DN,'_P&\&mETD pBi }זg_m_@]!TEl7}AJњ%/BzrOHw.<$ʹ%J%5tEԈdidqxǽi9~S@qHa[]o]4P3_be+xmqטӈ#cSgu -Q0[ 9S3cÖTQ=\}5m :#hނPA.U10Ɣ"W! `rl +aSi{׎)FXO,ay* :ZC(p FxZd|c\u!p(L84=Ql P{„O9W=)_@j L"]/.RSI=w\kRzmK]&!m*[44G ͣD@f4{p2s0]j#΃24mA=+*ܯ%nڒuTya [&<#;;i _=AnL,q޻Ih#xc'Ɏ{^}[MkT#ΘDWwKdy-T,AHww!%aX} j]!L2o< g]l[ ɱIH8 o⒒$4a <=wsYŒ&IkjIӖhyH-q7@B ROJaUKÈ&ԸwF6d}--gJb;2jυ>s#*eai/;=+ZzY'g+:o<K`G l$:UrYL[?3890íf2@E6RJ+]e"sɺ!IR(ED:6“F==ιr^x; $ LȮ"nTGX1V3_2/y!bh%G^̯HVi #oo\aU/hO=Xqcߩ1u|F? -01r/09w%V~<o{ l4~n$F?˘C7|S5H&N6E_គڟ}ڶ~iaèPleX'2ҸΫ㉎HKlB$s?(qaבq^ըRJ)9B&FuLŮ2'IE$bsMw”?A+2?,6}i}Wu }Xϲ)}quJV6l_zG T'*8{miPnO^u*<Y4 @aԒ]ˬ7VXEW<RjXNUjcz&^wj3_ߦm|)՘)YJ;￶ gH{D\GpLM!/Y`X󤵒y9݇T|J{~wa5bx>h}E.4`ED@!z9zH$"D MV@-s8!/GNr-wLx˭W Apѧ"1*'}+*;fG)sqWxxikҵe>gl3YiӸծz6:ܝ+I>]Dǀr5$9rTm5~⣩li^ XIѩ͖`\w,˞C[R+ ,)0w`N7cfHۤ k-oKUG`\͌[=jEd.wmYF'`2n|w3Q)1VR1EWʫb`2Acp VӕOSmsåQejTڄF iKF\®=FJT~7)""8f?F) EdM4[wm Ꚃ|P1 " {_UVE(@ǠJfTҶ- RPm)-CE1uQ|%ƯR㥯=63oKg>[acuc_gpy"Sֱa޵f~zKl}Jr8(Y ŹkYʔ(?Dhxk}[?'f`S YF B% ))]hT7a]E;HqXEOus< 0F240V{~w3Y&?HX쇤0̬/UY/)d`E!۶KF+yvD,/€atf:М\ݟm5$_VgF#1*]p;3QvSFj"[{T_[U汼k`Eq9"CvNz>9+'sɣ,G&PڇrطB݌.i%D!r #x0E X5 .rc4os=cZ~XiZZz쟗89c`v8ƥa/u  BO{G~=+釲aX9۶~_$A9_#ƒC? u*'Eqn0bVgv.XcUt3yUǩmܛ.i)NyϭXaxxVu ZxOX!ZU,EwQ m:!-q$naӻ{{V:Ry.>s-3X{(@j]u_?ӔS UO X7K"XFw 씿Bl EKX[-1JzwdXpf#{E[AyfVӜUx2Rd+W-&kUt1Y7߄p34O|car6u$t)X}\!K2]%zScUt3aW!_(GF g&xY|W0M,zMD"$00&#ɺ(wcշ%S+4'KN6#L`KNyJcW7"/rIhA'?8M!M$ɔPIY/phMYOĭocQ쭿U^;:K=[SCJnŴ:?>*;|du5kۖ{POLt=V=I5fwq;Bh-"voA nK< ΕBes0;ZvƒQ=W>U* w(lcŽYڸҽepWBԚ_oyCK:z!^Cd} [ϧXx}߂Ԉ#FW:&p3_򾐬3pucCxYӻ7?ޠdy)BG#4m 5=kWMj%][?32q‰;icK gOvљ,?̓drTڦ7 PuKPꙇpj.:٫ hwB)CqbU(5 *n1jG, #,+E 'yM)ګ{w?GӖz'44ڑ,.bQѣP%g=%u>2kzDkbcLr,qS&5%dgYZG氟sv:5EFThel.f.fppǭB· |}UsD, <uCMقyʶ'A%+4\˄,7XI lπdʜN҄_}&r"%GE&t 'JĊŠ_b5#@;7^6ACbW";X>cǦAk\*F&[LӖl.uJqU~zߪCiϯHv;wo''!0UQ8ɫzX]JfNDtbK3[b]g>/.u:чf:m 7/'w'7m np?6ͦ-Yz=9(ouslwsDGoDJjS/:{KЩ4nOVs S"<5~&|cVgeZXg_nѻe(5{6񳇝0dsdC癷G>֮xVXEW<=rⓞ P|IͻxQ׍D ZvM(Tp"a )?C9]K^y'גaL[z^ؔۻr:,ܱLh"^5+AHH=*=g9s;N6l:R<3m&#y6km9ޣەwf,D1Khq Kiӈ?@7pɎq^еz^sZO7ZA蛘Pϧ"𯈘VjC˄ߕp3h v-&$])c.2Όۚ`2vt4Cv] Q@:8U>3?,MVJezGz%zLƖP_)}Ddw3i"H5<ŢKr}`/}#{D ~zя/-? q!$鿉9dA&j4u9@!7*aX|؅T"%A7}&Is 7c*pʥ)iKg8 aBrԴYd4t|//&@2frcl2/д|=bA\ .MpӖO6KJm]rЙ6~>R|mK'9 @pM3N qGGh4|O < QvoKW3H'Gմ%+}sR S nHOjc:Ŝ"8 rvhx3}1% HBԣ*@^nbjK#'tr%^Gn9b"0 Ѳtٶd(-{ZF>yd~O_fi[Ĉ^j6oK7]HCiA7o%"H%9.@s 0`&b?FH ~k^ͮÜYH׊9|8!cK-;D,uGYffevec$e2)޶%* 5IC,0KINYiAlE)Ih,+DL P^B^!T˲P|-gU.dYTYkx.rAi٭C.*RG(Cp[]$^c=UZ1(ǽ eFe ͌b& |wцPW! 9&:IsIHQ[\arfֳo(?y9E)J-yt,_~fXc?Tm%?C("BvM qK3@"Rs*S\U.g` J\҂?|!ޟwXc@kܶ%{N!ɇaXxH)iKW_@p2īM;ȫ~bU|$-_Ěcbm0 a)R>G '$6,ْ3u<ԧ ΡPSᑴ\ YouJ=d`ߝ`l@ΑyOWqHլ\xs_o_M[=0ؽnpDAH Hw&2o<KAPY|QjS۔S}Zg(w֧uf0m Ea\W-݊|o~j(ļQ~;6`vްm @DǶ?2H p~N_ zzo(߰3J6Fôs$cL tƝ|cIҔ=atKۖڏcUֆ·)WJ|^_sli}`bT;%++;@t?̎+GW)BҸ))֠HIJ;+_:8-=eU+AvW3TO3~y 1(qƕsge7ܻ#+SU*HHӒ`Z8) vAi\ޟ@{2~zN_[i8X0$@|19JbAKa^kU>2}97i!"޶/I#[m"Q|Tc6%HJ悦~4GJ¢h;2R2u + b7Mކmo=@VF(;c~c]8rI8Ќ[qWg-5j$a(`,A]G>; pC<|޿ ʟulĀb?EHl)@!Sٛ! QSۙp m :rgT5]զ^j$i`?Pu^FʣLw l<r좐'UMʷGC)FN/8ByJm㓐s† 7gOʳ\n<{U?G';܀J蟞TsSPRP}Rk/kfڶ~T ⍌01F&VJ$޾}=J׫Py-3 } 6u^ߨ`H t^$Ѣ%\0(mWs%\Mad'.We;&b'?N-ei~B{ $EKǵX|c)y̬>m+ 2fo ?|ǛG2\ $dA>J58%xbw_NquUq(Fh^"ꦡZ%$u)~3^6C k3FCjÎYd9*=* w45R#,""F$T.*_:l.,щ 6k: + 1?}Io`h;1ihP}z>>b-^M_e)fƚ{c3Gt5?D?NG@Aoaxe=d";1ܿ+*ubz(J9z/job_9F@VXzFZr2"(qZƤMTnT6 G\*1Bۙ ,Jo~z&S;H}륀ry (CߖOSD=r|tFrOPm JO%dX)$pDO{͗vEeZөEN>bٱ,O Q|z7߻')j(bw1} a i?bkg@ϲp_ȳVXEW<ח8ǔ8M'N&LҖF~zl>= qӖ 黎UއJSdxKa"#8&p33p9A'zR:sF>)YҏK ݟu7xW۫lU+W:*~}ӖVZ)灳_(el2V}[l1#zu#ioL?*r.p/` +XWܖHeIH䦴:;IgacTkHhUmXE[y*+Z>mdyWHL%] Zi} ɞ(X߽?xۖϬGg8XbԚ1&Is5t\6bBwNE,,+9(n7J(:'NLeiaG<9>ޢ@g!RμA֡0Z*Eކime/at^D4aE99Ɠz*[|p;]*EO + ^+ǝGVMߢMȏ UVfH }VP' :@Ư~m>h/ֻL^M\ ӣ(aU 0E}0at_^Ç0?"A%e?G_S5}z_q~$rfVnL׿9^$9HOv1?my#=s.$yA cgD4ֳiKF_sʀX&֯@x]DyW)Ǒk|\Uѵ*BVaն%{&IQՕy%f7|yHr|#%BoFr]"{lĴ2c[ 4*8\و(lDPjDK₏"= ģ\y{l6V ̘t`ݨZrtd,Pw4E\ssswc-kD,GpK=Y,IsE|Z3MCxӴ%{G)̎Cz4`;~.۶dݞΩbġ9[yum[o--wj[ ˓2m`tyP) gw|s]g9}f_Y=tLY?[6>Y]"?`oۑc[R [EZ.1Ysmstݞ 344>,z+⧔ʹ%f7f;oȏmkɁ:(XyD)QD`B8E)wH{m0[.QmЋq&>cL|#c3~0WBl?EJKU*R(J4^{wI雋M|jQb7M[lu-Z©< _; zH u&|bUrl٪eP Hmzb+M˒m ׹|d{d})OFSf!pm ̢{KATZlQPpP%4Տ޼f8bIjc_d5F,{4 G0B %[ q.GRW:R24IAKW(2 E9@diSGGc;W{%溾QӖcArxf_O{|'+zOKa&I^avW5걨 :@ƈf. ~}u +ֿqoXY5u\s@ ^ߖZ,t'PGhڒu'Q.1+HrϨ[?d1~UWVk!>+m j_=R-msh@*|& !5m @ +أW辜jy 9g$Ú񘢑6ʩ HDŽ%-+DLWDT괽3Cz);6uK։ XѼu. :ƲggRbDUHQ3"{MU+c\5~|}m1x9 -97ۖA=fiϜ|#-_O撌'w싀. k6**]KP'͌jH3G 9ShȎ*2ݢd5u ٸC*NabZ#OB",㗇g:XֱӞ,?ݸz2[~;7xxƝGF=׻,?Q B#' y7X\}M[?ZDUii^6#x6̦-XXhVR,ڶ1nWE>b࿆|iZz"O j%UI :HXD d fO( w1ɒB]+mݚʖBN%T,).Z7$1"  ptiT'5 M[JX# kǚwuXeBtr\x`N9_Oe%.K2R)GRO~/ 5⨲*qXٸs +C=aRفd4Md%<.pb&d'XKH$W>n(ȜB{~5Xh"%t7G1z&H}$JWTaֵP?DMi#x}v, zYC}m?(Ȯyπvm )JPUyw$ސ}ĐwpߖZ%+m oQ-t吷*ƒ#RM ͽI"3M_we[}uI|Q~|;.Zs_Hꯗܺ2q JXGW6&DRPF_ϐK+k:s[ -]!g?R˞FzC )#0(a~h".bO<հXs$9"2)>y[.s+"L&yJ Z7aNӔ{ʌ9d$xyEXÜAD0fFy|X!($"NŎ7DpO!Hj!'kKR%4'c;بAb_hԔU"A۳jח'©N#Pq&+\u \4UZ0Xҿ蕋 ٭ h4Jؑ & u(h*3 E&Nvm Zr3/5%ށX+-4a[sAve|12P:{Ym9{hM[?$'>J*gztzCN3蟑QEZJx}:4FFHTpN'CLQϜ7Yۻx[Dk=G'K@l QVC8h(SŜpM~EU%hچWJhpmΪa''B77L0#}5"3  Dz+zݛߞu䠑oPc/ngA􆉱x>ւFK1w+zM[? 9z13G!ы@t!e3sxT]`zW^FH _5Aq6^vQ`wr޲ 9aXG ,jJ-J?H8ƲW@ѻ-2:J0u9הM ^o*= Ǿ)x[FђN|8!z=Aoa{-X&b]WMV K _+XoKDT+7Mp 6]5mɺo^'Y`taOCN;űG"ceefљV0z` x՟,\6=287 ӈ&Űo#="9@\XR;\!7/ʒe+t~*?e?S8/gY>(;c+GYİL-_]XcR[D;%3;cݧH bBID}%SwR}򕸇2G9u\3 '[D | zI:(R-c< a|:hDZF"x&{<ǪH.ߔ|GLgOR֓K0QÊ;tUY]p蹊B=}"T\53! wL#G>r0de^JCV jɎ{]{8cP'\rkSP_L_4WNUy7y,ƒ?Ld]zNZ,@ҵvJ*z* (*Y՗ѻw) E3dbfÞ1{oawp>ԮǤOmӪ)'.y\17_u 񘀡ԞDz*: V#x&lFnr``^վH@/eLx֑4J)YB:<^v-#-oC4)|Gp\r\)'0XS(9b7 ۽~Ngm Fd 3 ͔Ρ>; -,nz32(H^ȡ?!ީmT:#C>L*Nj%̐-Y:à%;k`. ںfc!5B9Gl(9G(2Ls͡u}!ABH}:![XD, <ȉ wdb<}[?mZr\,=Z7>>ZFo_~˫8$C\lUS`ڒu{å"a"\-/IWl\2HΩF^L.P<V1M%Gz0iKT8+BEmK)Ĵ%{6EB7VӜT2"(ӖZs }޶~s1-pgM[n6pMA𢥖A4cØ<"qmgnG}B᧰ >R5K ~vL%, gq\!2} )`8LVg%Ka7Y7xؓ*= OyOyF]GF:\[2AN3C:yh7=47tEcP x @P<[A{Ҁ9_ VR=do?ճ6m J!q-^ׅ }:+W?2%Ij_PC7hI3K e,A{-p9.eZ߹d%q:36.{"j/٢q='Ê@л7xңJ (Ӌ0cȦX;[BXGuf(* V^C G7:ӾƯޣg{;b+!^ ;0m<X^PñL&KW׶rԺC<)o޷Vz\%cWm+%cW}i]hC*v<@f_K1{ v$8heBX#6YZOlw[zoy^JzDUvvq1sF+5 0T?`Ua<^r*MVXeWuS~V$DX`q0f/zS#*zghvs[H"n QƲ@bƽO^ Q^ЉIG9#27} *ʥ~F*Dn%C@n~f3"^nxb kGy0?K#RiJWN  '|:wSnu30'ؾ`˥Q<ɺ6.r"& >L;b?aܡ]5Uu Pьv݅Fu~Y-eнl#a0~ Ɨ)ζpr&(zB|U/pVZukzQ ܥDwfckF  t^ˑfC+ [y*3然9 -/6W&^! dw[`ByM Ęp%QA=j. ^e!+dE= 7I`?.r_W~gє&K.z 1t81y{Rg&+19a'֜%}> |~C!~g>{CE^VVD}!H\f(ŵ( .Y=ٺ#C/b7 hBd񒡖r5\:縂wya!01;J0E_ *pHkVx(ZL[fJ9i=;/'-)(hJ7 q ʂ80[q ۛnJZB, < {11" K$Bk}屖Xf2x=JbS 3x(Z;L_%eW\ sv̓=8c;!;yzgg3vK}aO\V_{~W0?B%MC\+7x~W`}1в7RҝH;KR C 6 n=JBr0K9^HqaOHFJsXJ[ `Fq1EY'a_V&0`C.(**zY>svJ><DbAS"w^gojcUUv:!uo ,)e%YQ1, AB:5\a%f"R^tl@LO^"oQd: I'SԷj:Г:i`: \b=gp,6~Gڲ*97VݢsLxSB0Vm- % Xb]WYﶚf@RH YQ{ߴ(qtC5Q5ڟ*f?W)ǻMyUVށH2޲_ijeSN!|'/' # Bj,Іҁ}ťdΖ>taj6=t~v5l5`Qͯ(KWw*[aLRv̛s_{eu%>R7mpp;<q];.h+vF#{(Jxm&xj dūiΚ~bMwQ7sZ ^/=Z vޡiDQ:a.$$)mLiq9 MV"e[%Eׇ]z# Si3'! 9IUTU)lI)lM!i]s.6=(Wٓ/wp#kfʌQU X/)+SЕ\H "Ϟs Y`6ɏ띈4z:TB~nF)KrB쾭=ЂS0w஭XofeU8v(f }gw/%WVLDe({CV ;+ʮ3x3o*&<)V)J>LlXb]g,8>IQL`=g=%Dfj}iRmi[n~De G呝uz~WfH˙sA<Z`JeXOS]m^nҒʴ{CƓ`aRIꀱ~ J犠D!d~F#CBPLy YnW@wACv!*b+%cT Q[ϛkdGor̙N I][n>ϽH`^z%%',qacYev]!gax|0#;"r,6J9m.IdōJ Zf2xb#bgȏC9Zm?c/YNzUeę['5i ʮ3x3:{aG0##Ydwf!ؐBCVXeO癒6;A*RsHNno9;vHU'yf_hQA;[n! >GPU~{rPF8%>*Jc0#蟍 gM'Pm zzg¶wP$ V:[RS˚UBd y8P@D\B[. m+wb)/ k(Ё8Vc-pD.=BWVR-2~U5ŢL"_Z*ϵ>3_@$R9gI”I<8@6Uh[Z_Ruz<r) FXm\cXHt"Vy>_m-u:gU\Xnp2c(`ȝkК&y0.]'>~̲!8Z,}WYotO;T"JAXU6O^ ]~N~Ui$QH"*zY}sH9>/wKV٤ԏ**{:X?| j} (F^UUO͍'\xGrgGܗZrrKz20rG9WXoD'wqJ{H5JO81 Ȍ'qʓM|XnP=3B eDvet))9)#a"(m-YI@F71›;'eǺ?v SݎCX9+‹2V3HJX\ IZYw˜6SēϢ"tZ}X7|q]ԥ PwtN2^*(ͮ+:BK@=T8 #d\f@5!.$߯Cmb!\úN(֪=gas$Z2k|AGF4IWQo6B/a4,yZ0X 4FO<] 8 }r7H`*'$K@pEYNjAci[@DP9'B+daDd *H^d9i/ݴ9TFB ]gp,6#!ބ$ս1C1 "͹-E+g%)+.@̮+d,\\kvT-C!%`;cwHԔ`剳,ߍs-8y[n N\+d!nՋ>z 9+K( ~i`%=֭]܂~ZMQw "zzFgbQj1/<7sH NwT^Rxe9E}Y;Xb]WYFsgzXP0 U1F akߙ#q#V+jRZU+C{1\^z*M*ՄNÎ bBf?!HyNW%'N6ӼTwc)1FeO %JBY^^${1^s=uWزŐmԂ:Â}~zмř:FpkRDʅ|}z!%7ʢ__O,s!P_x9oysld˺k9m ݿkڨ*Np0\Gmm[v]#,,"WܯMm+#,A@p:t5F;nº#e;C8ʋxd*j 2HcU!V{~jكBILItvhQ!F31+ml8L9,Dwܩ [UCU$gUB/ekUUv7DҤzFyCl[LժX ^y'~|IIBzsY{hdݩ,u ź 桺|ŧoV9Z/.ӪL^HbD]gU^W1*h:[bZ7BEz~d,Yy?ݿ/_˔`3^2r%Uw/oqz[ K`V<_!ђ/+d`}/{ZpÁ/La*; z'whfEN֊=? bb_hYnPU# DT7LY ^=M{fnZ{EwM~hk-"%q4X%h%~Dv3 J>|4ϯ2a$ЪbѧlPb! Ʃ~%lz8E7D϶TOgLi"eG-L {+ճ^]S3D{Zb=X8]*?7V37]=k:kM"#\V.? dS9鳶vڞӵ{>$(nӬTSa!MEz%_Ie}L^632(΀d5I}ۥ\*RRܼ1v 0p|u$C*IzX ]ܪ+ ScWM4V;(O"<ɴ&(Me߆~Ϝ[=9'c;vm[nt7tZєR? ђڕܵѓw}cXtB^v 2ՖVXCVB+_FG^D3VhJukmM$pGi+w||iûcۗ;kj jOo aɟl9a_f}0+V\qnӳ/tmfXjULARqUwU"޽ROP/IVpM1. |wչm+*.4۰"]$ݪ(Dވ T̐k*XΛo?|ީ3#QצǶsL~T*͆ Uu+_)ܷ@I[c+t ~wPW쬵5{Vjx}wV h j!vFvϦ/%uCoY+bEqV Qա+d:4{١^ΏJv`NSV s]K=rJ46ml x$~1uIATv'$9hs^OkU #l Lʪdy|8scy=So<I'ڪ!$ҧ,yl+}r˴گiuSO?hIw3ݝe!u NM ʸ0P|u; S}AxONFUƥNՄB, < oʳ-ޜ刍 3~DIT}K[dGeT,5^kT/MQ2WGiR#Ѵ rZmHM5з$Pik˴˙r;Y;d?֡ҷXb]WYo%Sg%[_ek|e u>)`x@_.93`, yp9:CH c>a7~f9,%lH&Xq۫-t@>0& 2`U,wJw[TizV.!U5=q'yyi~Ye^v7IYWyeUӺU,2D}awX{)mU,rmk ~y=ᷦoRYŏM<B, < &oaRf_}gƤ*HzWȴ{s߫kۑIZ'|M:3:M#nÈ8;#\1b0׉XgWI.u*.Kƞ &3@:zen,uj\³}K{2QB89 y d:لtIhВP17ȩݺo߼im x8. 8&f0 u O\er~|Y;(%A7u&Ƌ"'AXIW~-UGvF|}g#&2ct2yqE0~>bo_4js"3,h]gXcչ%Cn硛ٶV_c޽)>]B@Mԡ ~u_e+HYF%iLc[ mͤ˴Obzl+֭+ ^2I[2D9l3D ϦiZ40VquKdc2Zb]WYxjO+U,Tl_]Iyo߮~<]=M7}}~n 1f] 7/YU*fھpWEC5 [@_-  (?!)RX=βrP7!5 \=HZ*u ^U!V{~W_q5ȧfnj@zJZb=ga.g|eBrn!o)wx܁'\q&> 1KhFA|őOЙ'P5~W|4-!|u ia:?𨍗A;'#B +C9M,q͙sy'-Bq?)m?7O`u>潶]B( Yq蛦-FI֊u:ʊy!um7Sd:OWOSv%@TU!V{~u:IxOO)S!;4YB|g,W Ĺ_Cysr H^BI~foR nn8e׾5~w[+oWHoS43!PF񕚼LQPuKd`NuCVzP% 18t*a=Jz2ȔA謹V"è7%z1ʫP?R߇E>px ™hɭ-zp?])x~fBnj'#bm$F6~;q}\˩RtuKf{RtW)_p~n'*]akбHlnI5kB3te!u p_˵ %) RĴAiOh{ x@ڬ ј9xq`A̮+d,Tp!y&yXH+`֊<3<C < I ?cͱ&2:4ʮu,fnboըXFR`|AMw&38Q!)^XjDXƺud٨gYqR=[~/"@˜2gVgu}M"𙁕}g:jۖP`1qG)ҕ\q1wԝsԪ[ѝ1,0{Xm<0Kb֯^\J.DGekV-dY0e!+d,7n$EZʹ7i+-unK*imzjk W4+,wG2z_oZư8~@b|Mۿ.JE^wZԴ6:Zb\!~"W|欯Sm8aEƪm@*ei|灩yǻ~u[$DљOUKai=4Ư]ѡ%H{KCQU??FÎc~ l γ p2kH$gɞWןg۽*Àv*tUxM*8#A`Y)dКeOٸqƣMw6mUD˶Uj4*({X/jZhOMu%-B4}6Lxn eW:p{Lx* }}㒳kڂGfwt:qD>d) z>qBAqX^Xqv'uE 2^Zb]WY ߹ IִHi+w II1ځI::F{ntqfœ#lxZɔj[qq~][?;c)`˒$l8 h]ђKmy^`cl?yP QGܴhB1 BHABm޾J\-$9l;fNX:~"uET WOquBu.au|+s/o|dRoX 唀r:0~E|V=%r_aGb ^Dw0US-|#V!P%:bOhޑ!ȶ3/ێ!4=,-RYHik:3)Ʒ9\7鎑,LHweIuosb]g+$}^([1q](LD&ʧϓ ʮ3xs<  Y_d(Mu FgEgUUv \A^g`r"j#tQq(>fP~{*%d ݿkk\ azD=nbO8M ˖[)-^TN#ZiBhYd kʈbȹd}PT0ꪗ3VXzY|GWPN6UpbkFVTQ5RZ{:k+ XJ7.30\6!UkOcڊGj{y.?Hw;/sEQ烛cXׅi[kkUUtXq%t=\)p^'3[II4ZmJl,W~0g'4:ؗ 9Vuo22' z_ (+ҶSQ>)\>̲y1%cT{j]Lk-rO!F8U1e\7"iZ™77~P_T*B(*B~c:7aKAs5i1bެW ii# ~3M[[h4ןoO5tX/sfJ"viL*2;RMLҭ_kd!$#rA^.mZb =^+ȟE5"ÈmЃ(ʸLϠmź.eMA|4IX~+Pr2 bJ(m"H.hsiύ,(=`h㳉Xf2x}gEw.?.:RۚM뿨߈Ŀ#LJ(3V<0u6y9+m}˂ݻ{3 8kr̢۞H*?]Oi+ER棂}P܇%y> .mBKҡrlHъV_gƙx8WkSzjeK>b) ~⯍Z˪XI{lU퇎FXmܲ6Na{}͝,㧇 f-m<=?37c&.+{@2{.X6l~hZm߂?`U@{ߥkv;%i/"o߷޽_t2dVYNX%ӥ +x}E8S8^ < aӤZ`|[ĸ %9SJcJV|eM܎kvaH/>Ѳ|BfƯeQ\Pe޷p`='XOgG e0hxPoGߙ394ǚZi|n\i+w1N k۷`WDK 0ڌe!u ch=1*0~moUh Vv}N+o1oIZp OXK_ku2<~2!ևi}QzݫLuQ5uPW_wI^c|&8 Hdv8&lz&t{ԧחy[b,M8QlpDpH s  @rQB#~em ר<܎u~Ć}5gLy] 22mUfUm߿w!3zrưay$][{r(DħEAM8asvPU?5L߅ Zn@o{ՕXH.,uss4,0{XmI2&H\Vy?%v?k+g<<țLE|$ S@dC&S]$RgWqJ&ZOTXԕGv{6~WU2Z6:X /:ΗhTQvtX/|#T]$֪=':dB6mÒG$%y#G,o8p_]ک,xz$@D:]jZ6Kd NPKHHBI"᷍|R)\tg=VV(֋@T4,8t?-p\Y|oUdwC2UDĠ@bm2U,-_YA0L |=bV`kz?P==Q7`M%J)xVXg=ƃQ!Fwn&s7{^f!̲͎iUjƋ F=m"G"k;i}'yVEBڽvkSn- <5'*Ɏ^rM'eEQ"qp#G lCVKp ^D`e?gPbĬ_eev(IZUTUʫ.VJ`_ӡsW6~;bX(xd"TA/1iC^"ݘy[UiSE$Ie͒.m- ̮+d,V¢~.R8 Um O9f3Y |\ZR>7V9w.2q0)$CL{.zF %$-8[$+}֤X)Ǟ1U~E[)BnPV.G荵&_jVյVdDs/_3eޒfK{]׶ M&S(^(SC"y{q=_޶ B7^X,лe< ^7<Ϗ0Ps-Yrm[?}C vX$p[9nb ]!gqȨ>+ߦRs s IḧUV/b^ĘSѵ=DJA;d;ܦ6 t#*{1zJ)-+JIbDHNRXb]WY1CbȐp0 nq:o=Sw3ӆiz.۵f1h!OxXY\5r#G!lo_5zrkL@,H%`ARӝ+F ݧPߡ=ZRvջVXeW< 3Ǒ̌-2ZP5+,k( TƶXB Ə|Ztg E{Sϩ`@iȀ㩣w!v5B-CV N'"RJ.Z9er#'clpO#։׳MTZdU y(n5:P5Zb]WY܋ e# gYwquyy&(&cU1]+3V˿9zoD$(@ȥX ӫG VRyY}nV_d| 晴hJS]bM_Vn/[\-4rM~#fRBu_FT&0GFcWS]dU,r "R }D9mxPqV~B:NEs~=gz}0la45^[KΤ1E!tM`]g,W+bѨ꥔eR]9lAb~}+w$]N ؊2J57\9ﱭs~i4k#6U{mĊ@t=ɻQ]Ѷqpi7\.j3~؟;:: WsݬCZi'a?RNRI^/m !x8!,rxBV(ae.YBOk}Za[)*kLAp—3j%O˜xa ؟`%i Xi%.5ꤵ ?py%cYW_!{ij2lJTk'=3 X!͆}IFBXW(_EHPD wZDırvcP!06 J+ѷ׾9/h" 0[Шw"qa0ң1F@L3[:Fw<׏{X+OkTeq#:=H\ao.5R)pu1.a}CzMrj珗;=3Λqky2m_^V$ 8 Ѭ6 w=m-޴V %Z" k/:ʵk~zQ|Ek9;iǰPrhGQq6|T Xfn^xnx0,c}}pc񅡎WMEڧ`@2HҨQ[E 89s'mpT-|A>wG/&岒77*]u+/-.ŰH0# Qk<+)^2?q)yIUj1svάY[ nuJȄ>W?i `=gbZ%wY@,4-ȓPٲW*{~lpm߭m*KyW>u>j ߸:27}{Q1m7VGxnaz-}3Ucڵq۴=o+RK\I=:(I# ݜSP 벴QνEb{C[nѱ4}tI5ZkǙ~f졭|u^{Fmm|if4vjcYev]!gp\J6dKT/ݤ4?tʏ%x zƯpr[1ѸF^[0mvx%@[GҷsDvxHoᴑs #1Zcysbnj~m+ Fi*ec6[r M6" sCh YP5o5p@2Īs V`4քu`~ x90Q1U[mZ@tz1V:pC|>v&*?$xp|<Mۗv"HP>PuItg"k+TuZjmhs蟶~HwP xhjj7\V~i51}U%J}$%ߖtWXe!s ź Cdh;g2yn'3s IRCg<1}W+` c%=U[3GƊnxh[hr}$g ?h(hp#LLqQזQ"յebţ[I7FjUbBt+~$9q?wj}*`~kA%cTQP@tlO2[DLk}IPYd5ݜ4_hƁ>.=[7L[?S5b ZV HC?זCVWWQ)V_9,RACiCݏx&eP.7E*SVSc.] 0mź/ N;Ysov}m^EE6*5ٞt{^g=76LFgA扏CXW/{ŀ\^h- ΤUi;ZU". L5JTM){fj}84zN4¥cП?,2bM%WPPEQU{#}=gqJR.H*cɢp (7mlܵwC;:'Ǭ Kj Pp'NdS2YKWH2a:rvC6A6 } %ؘ /x.4<ޏ-U3b5%ϴ\pibmcbx _cMжq4Mٖ+8"Ջ^űߗ9_jۓ8"{h_?_׏dٯj7R3`pD5kkD7q̔Haeɱ@ePԓgheIOw=Bƪ=g PMuiURxGNR ӍeBΊI;+N6Z;]F }n.VF'O}bRVs@K,[ѓoqzܜ蟗6:({#,t_ض~u юR_f0.msP_](Z~lƔH -gWߨ#RbX'!VMYra87oaecw~S/tN| b[pAڥNqZ e/<$#ip֧PɅ; xAݔx$vRm*\nݯڊuS#D6 +4ay+&2',M"eX0"JWBJhH/Z837)$ޓLԩ# 'KaY'AA]m #{ǭV?sI?ӓGwau%Z a,y1 9~U9A y&)}|'Oߙ%F7 1[3&yjgyJQģG٦a ʮ3xg+)rh!D[@'E3W7rŭ-]_]hep˞ ތ|<M&u՛|K4VT $i2ztܵHaԍPi"Q Mn⛶+m*6ƒB[4rlm'i0l=% AG# miuӊ$qb{5jvcY*#{lsS;%=sXn[|m1^DdejU{V u3HhI-Zqz2 8қqi5|1xp09#͑ ן5 )ѿ&8bV>J%|덅Z0z!G;Nx:o$CDKX]ư^˻\.aY' pM@tk{񯝯i+D {Ju{<'p>H![pMʎi*UgnL:i_7i6M3KYbxtvml#ټum\{h1K۷B'LJ'YԟGaL}tƞ]"hNC"sC{`Ưn'H[&aU5DŁ_k]!-;R?34)§Xgky/u'3TUK2x/{0O˔t$!a'n)Ace츂w=w913=`*&` 4Nmh+M9)O~fs-/p:4#h=MEW'be+u)Ϛҵ]C%vru(|g]?:dο -d]L^# UTUu)HL(yHK-X$іtBj4XBm+M/\F1ZVW}z2eD&UFnOݾd[Rr6M>B[QV6Q;ஶ:jr@*{+(@ Q)@Զq"!7h.6m*ڶ\}'_]=y(G437(n5Ŭ:>Ltlb+Q[! jBkVŸW,f5ISd7 ~.ȴQ#Xh qojW?kP pX brǙ10-5Y?^.w Z8 #L#\\xGJܕyvWACރB؃"+L'52CJ1;Wv+ G =RWд#`ҍ߼̩~guvmźGv; $^o op{N,,e#A% }iPͰ@qprO>;~#?@jo< T JJ?j*wU Z/Ui(D@z_;H~"r?Y@.5t0*tpD=ohdqF' pD#0N@ mȋ0\ 2H@yfq,Tnwvdz!,ܮT![]mF~l+2M*mq:wmL[?s0nS_I–)wM7G9~Ȃ8 d ~?W3[BޜۉbN1$%g{kBQe ˹A B F@)kxfO?p2%#u`0hwoxJ\VgݶwV)n 7NvWY H(" SkrV;{%jk ;y>B`~.yH>!\e[28im?u!#jjb]g+kؐR%ڶt_9IӼ)~.99v@Ġ@}HdN{-POS{ V{~{7TyJR\s#g6=ƶ4VXeW< ,hĠsF]F+ ֏mZZbYoc;m윊pT | q3cCzAwimXW8Ҏ::kt\DЅK؞r5S5mmgq` gv+eIA!+zJc "nBY5UVk6$?&)PmHDQihVl0#ɹd'JUb "T$/uz;-Q㪭SpͻSh5-e$FVR=[;sde)G9DSoVF۹z=Rh[Z|_TE9pLʟ]}jbXf2x? &,LCѷzu~g8>{~JC=@WyH*a-z>:g|h~G$92/?l5'.M^ɮԔ*5>ÞBn}x͟bk"C?*;IzM%CIW.ZSc7RB˕'r2.sT2*h;ګ>3nsiaS!B7 0珮m@B}T95 J80(XgL"Y,w+e! F$nd|H59\[[ Cճ÷q7^k]K2w¸$Ͽڎ+;r7)5.{Gn`乭_t u68MM^˖愡_aɬ餸%kG!SCzG*`e#bԀgĘUʎֵ48avʯEj|;ؠO^v6UP E}:b2Af4g-R^z,."v`ost"{ ID|= $Cqn2b2Vd Z՟Oדq2s 6ֿg6: qmQQ\C 1E)Y8A(beO c؏uj3Ohw&TAx ĢmT({گh/ %]1NW:i\* +ȃw3>a?^0f~|Kj3 ')gӊM&7[db_Okeژ+a~IA??=W7!6ύHm=TֹNǔ8PMx3#wУmeZvQ~>;CHVM"}(t U5"XJ,,NS~Mײ|#'d5t҆ޜrWS%(V!sr"N1-x9"խlT ;ciS$#3VԀD=+QXd-T7h.lX@c0(BC6 /ĜYݜo^\7(T ̌jW0͎L@Y ~NήyHJ`5 _C|9)TbkVi~3)) PXG>bhRaUpJjjwV'Z6R=[EO_C[?5ƍK?k:?T9u?۞8H2<> ,`ziW+j ?ʯmԞ_em(mkPV^}&C mULܟi4}ѮL>w)?2򧭀YfT1ʮTH [ }(i%/_-{ ~q' xsC뼤l̜ [')=jWOwVIYybWr ub, Xl_+`o^)D1 u?_W 4Ft[ݰgv톝5 9xeQ@t+G-'SK(0̎3U_$Ᏼ&*yՃ~&Y`Lc Sٙc﩯R$[8T#[OOŰ̞ dp,&qRW$Ґmi#;%;[5FߏKEMH6B3`U =gyLYþ;Ǡ u+q'Z}"y}3 ɏ%V<q.|h(/!)0arlӉPyˮO3(R[4RV)3ā8x fڪZz5w9}~-O{V-!Z-vݛJ r}|8`(?;ҩ".Y[oۮE۶6Tja]g,7?`` eË9)xEDFFiACp{^T_u~#@<}L 7lh/*SA +,Uk^Ÿ+"RF/d\]{UI^//0,ԭhzj|lۥ;~!Rܢ*cF;mI^$d*zYﱪBN*u V/ߝg|PWg 9'D̥wg?ߑs҈IZ"H:Gu= mU ~X#"I_ͮ71ls@ăhjаMHy,fZ;ٗK⪍5J:KZf28֍fM)Pc7*"v2t𴕯 z !TNZߦS F E9߷|Bz"^rg𩭀>__z`1eZ Af]/!ݿ6D粯F4>Ǵh>kh]muL5j+FqԉC%WVM!3$-741]j;Fo5jyEPw•U-N!z-a]WYLeϿD}f!66=R6룧;}Ƕ~җV}#Ru6?&[evC p?b 6 +b7h):z% R.L&u[Q^=& 8u1wM@յ^Ty ]F ]lnް(!͸ NBV@!!DHR&>Y#cx zQ+h`Qls:hY څOSCPN5,c-X.4Cq͐eC?iRDՠ68YWx`:&%,,#]xBxk:'#87HVQ8ӂFϋr-12Zl:a6¡̅EJxɽR,z(ұ5Sg"Qgu޹iT3422=극c2﹫$_! e1 8Sf?WE"3~IqM`IQvcy\XL 7Eԯ^|g5Ї+{뒏1c }SjA,jt̤Yie//h漩g="^b;^@64qTؖ{Jw:O( -H =ؑAyS<!:XzYL }jRCFeh+V!>{_+Wmď8I 7`wړUV8"Nq U"xR:jU іe'py1zH\@iLR}=>~l[plʅg3ܪ~ܗ{.&-V]keߦ ĕBGnz6,h]gXm\I>RO  IĖ|Dԡ#q.S2>A]6@sl|eHJpA2mtn+ /CUL ` 8^ӄ8հ>m;HXBD4is HX: AtȉN  .Eװ#,^|V!"cb+ X짏I Luk5|[|GU$ V(ҫǦ^>&(]iOukqfhlu4$NC/ixe|4?ǰ38pzyg .MT!h{DV&z"|wةqiCvi_LWX]qW!5 x=D߉P=>BWǺoIKbɁ=QDZi#k 2J x2BzSD|I)H1;VJ Zxn0,#? GFY;{_$Y=6O2!۽:Yj+zz纓.>J6x7#-iGF OnhH!m)>IꔟlStڒ!8= A!d>z#̬v?mdWc2P|e25Kw W OaA?knlyG% P\ZfyzӻUI{u_j/cIVyUTe-UFSSF0@owGd}t DNG߻:z?*Uv U(y[N3ڛr[nj*/kjaTB3 U+dd׳HS.Ul)X!y$HW2hjgq]nur\JLNJKn>khh7}<|fzD[ =V}$\{~}Ľ%&JDVu9VWN4W͹ VIXm))pRmJ=IFGPnLUS/5o+^L>:U?uBv#!ap3xccت޳S .ݧs]TZ~0 օ20SHY3gm!T9/%q*Ɩ'FiڪVٰ޳2t_Cӟ!0" gh i߹Rs‘R&' n;ZWZ\fn4fZsYJ )*謹);'а^2[4x7Z{so#h` QcDڇãLZDWfj{d9h6q'mPp hH_jG-tnC[?@cZjS:kG3{ۊvY1} 0 2HFdV;@ۘHfbfmwMaۢXlwG83C[?Tr>-fCYVO!.t]ASnG@]FbxY^87iE58 {ho??5 HT8k0;Q@Jb=g 8IkAZ S2mGRVŰhAt 'MKFg\ ʌ튤 n׺~jnQ\8d7X ґb`=)11-*l"I}yE&A_ݵŖ={&/$, U&YݻYAt4,AG:iU*lFťfD{LE7*tI̒ʎ}-q2xSB[DcyjZPPF+2;SdPS+Md@/י#j+X}`J}3'`a&ˣ =݃0umHq)T>)U4B4U\kÂ֎T<꨹~Q݆:jAg0 dh+VNfRF[0[` W0OTV;F0^_tB[/g1/>?+5G♶1v)sp<mU ۨ-mr,{9Kk]:E;q.;CŅ*8Z$TIߋHa*bXf2x)q{KWFj>C.xWxRAGʨF38p-X|j.ITǛVOY)_e&bXzYϱ_/u_~"NMUow=ibXeOv@" ㄸ˦F [?i-yg:f\@j.@4BJ埙z}'g6XnVkĝiXSeŪbfq+geR%Į7;:ǩr,aguPA"[Y#QEBD41&?^x`jٲ0+0 ]):Dd׼k$ 9LTzJm~}|h ;vJs yJ ,<{Oܻ$yޯ@U[P.o9q !wRD,y`s1~j A|QE4t)Cwpm۳eeDd~S*1mZsZX9 n}LNmaU'C9%7rg7>Lw+1#Q_,='?ް  9Na5rO yHk!1aA?kn=0=iUS4Z͂z<({4Oc=;=ʞ}.׉4stsdqt*8ѧtV7;V 5ЀЀ8mr YȇY0b$Mq!ϖ]+5$ۊv{'u1Z&g<+H"im$w:uxS{Rm؊ke Dϊs[Q)W'D KƓO8Lz:b,:XzZ@PLCp-$"x ˺${{Yj+/=uzl|Ѭak`gGn(~N3_ΌTD&Yɰڶ2u#lv6fA=nh+VlGR&dOڊ-'wIҽRߟxd%I}-I26+[m7=x^YhOƐ^hL:qn+ڭ@@%-ZC/E]!8x84ւV"1HWV_&GJx[Kt0dYm -aB~w!rm 8 :mxu&0a2&(&`IEZ278|FP,YH,d%Y`2*+}>fl+ڍ:0S@ǴZl8RF#{ufB剭~o6l;'tJUA^[W\ix$ ^iC>sXW^)hv8=n(ɛT/#D6|NI>hUv J{&CZB>$tC+!imgAW0r~T`T.L&a8 ~7z11KCZuzLd<ekK oӍϞI# g{d{~Oqpdu3!||V*>ˋՌ VO uܓaȭ"U'AlX,G׈Epx:;:6Ȇ0ߏb(}x6X>bi۟6*QgL#}oT*BQW۬~4HWFCk h1m$4סcpKbf;!h>!50{hxeKJ' Et[?4]ѐגVnKv[]Dzٰ38p/zwa ~Vl[TI-TU+U1 8(z#(z}QTQr &\xN.Ÿmԣ5"ޅc:lxd4mUi#]4%F쑵U1  ԐU?(m$Y)nd [{ ![OW iw4ɀڊi9 m[DWD>jCZ -IMEO:IAF#JkVOo7$T'Rg2zL\y~EQwb/qQY9.ʰn8? b2,99K\z=^_߭W >JK(%@^BSF&YV2)p ȍBzif /(+]#POtx2ǘ[5lQ`mf~ &x\[tk`)3H*#ۣ[U+Fȱ={4,4OS>s=G8ɍޖs]VM6(l]rz{hd]MT[?{R{Na{5vP)6T|/`Jns,5}VsmxNAKwC[ӖV\ӎfn,ez}9c-.8~ޥ{vrO&bĆ<ѽ41@+[zG#T[?{#c$ c_QŅ2tY "C@iCk)NC~1^Gj̩NyEƼJҥ\O3o<m]}٭S &H)rDŽ'?1#KTP~Ӄu-"sAH1 W6]pʭͬ&VՄ_Qj(Vޯ8a:#0CHVͮiu}a`*9yQՓ ׿k _VV4>IO_C[?W4@ .X f7y\HlV( ` ͭD ދU[nڼ8t6z[:?$7|ʏiV[bi,pŒkngP<*T[M?[Ge/b*Bp.@&iQN+鳟Cy ɿ]"e\|+XLoWdh3w% p \~"`bf^Ӏj*KiQ"+rcU1&LѲsb}t|~vkf=;Pk{6uy=˯n+׋/x3%RWcW }O] ,֩[X[2y}U^+X`OG㾫<8eRAl(nQ_ +|A0f̾-u5+EA䖭FZ!cU1 Xîv\7I_ڗthZ!߫sh]WS:,л5{1Y b+&ȬC j;(1Ν^fej.:q5(ʋwT@݁)m޴umK-^B(" #mB~^MmD/gb]x}n+WX$aO[ `i*tۮZ(#<))-,ev]!g?]NS| ?/낣w/zҰēIDSX8TRmHqyz$/ڊE;n)WL !xW8PIXcfbfO ۊiM]wsXVwޢ(4@= Q0|']kk3 w`~h/mq$HԴDz *Hݕ&EBxbv!h8b\BP1C.-|x#3Vmq}TB诎j+ڭUdrĞ$6K' xiI} HU橽 KQx+Nي.bnaU  ?q_zKNIv--0ݻ9WlFhLƚMšm\]k"Jjaֻќ EַOZSZ0S}J#F[Cx`a\Cb%ri=OA %x遦C=Hlh=_09Kx7JԀS@}mf7M2D~u`,QӻLR~2oͧ7nSn+g*T gBf yK)˗ fHO'p\rX{4{ tOD TOBL$+QAkbXeW< u\Z|`~<0xS{ >Py #>h kbXf28톯wW^_y ~oIc'ڕ[yittn-ڊvqGɪ1b|:sxprӊ( m?ސ6"k=%VJ2ji+sHf2y٬% x;ŀ̢#!h##10(Ҭ6xjBsUPxiQl} |trrf>ЋhAմص;Фy۬ fWY;[mkk/wDbi?^V3xӉZ+Չ;m?+>mIB>7FC 4HGfPqQ>Eҟ)BCLܕN[*zYOoCݞކRѥAKq޽FצlU =g?='$K#3js>I ߡ?а1 SItgbq(3+Z@N]![j_o~Q~WwɈ4~6`T~F6ѷ3QfVg6UC[&L{)v6⋅̅[Gb(H+WUsm(Mn=6 DՀ*~:Fn@繩hi]YUᣎXG!y| uɌ: :G ࡭hR3{6dpWOԏy?|rNBSN4J}ūR}_nfʰat_^j픆 i?F P1P.0_JIbW3 5bQV[=eiB~Mߊ"r& Nqژ)k*Ufӿ*Ip[vUéīҜEq$pȅ8W݉`U1 ՜?6Kܫzɻ:z7Fzv@>߱@>|q<'L2VB>hJɲO & \N^0| `tGdNFz#LrX^H1;|%-cCnU(Mzg?X?9VIIpdX"9Dytfo#Wnjrz_3=)Liԉu[1 J7 UUm9$f`ZB.qE ( #4 Jev]!g1y?Rdl5#ʱLw=Ʒ XEhCWs*Uv/ޯrpp[B".P`ib593r{` gf%LG?g()D,#dh+O_1EW!5-RǶY? >[ʼn`F 1cqISd][Xm~{zJ-aʐbzt-*ޫͲtH~I'*?c/ftGM)?X'o P:٤&yNmd趀zlކ'v1=#Oʾg0B"iR((QzH|0~ٚM`Oۊ;_ϯfaVmb-_8:j+~ʐ-WAКi>%guYFN`hS W0\Jj,6G 3&BQR Ner~`Ul1G+Cp80q獩+," J{{|슩{v yz @\'5ŰhDWH]j@wصx(Nʦ\@q'X[٧~k>5%%|.C[ eX>R_'u:kB yg/i`Ubu UV[/?[=~t'F|}gXm^Vsº)ы R^T' u&5Ff#AzgkXUh½ܚR~?'J@L\)+Rv x 4R}z tIVXÜ(1yj+~EuԟaI|_Î kiÂv,6/a5`^7Sc,m&ߒ֯OB D(pxyBwY.+lq[UI7=9f:Dfس) .L"/W\eUl\G"5huU3t\֤t}C]ƙn WT _Z|ak%2(;|!Es ^S8ƀsNWhq3`r&qJn+>LWRC>{ނ.#Kli(Ŏ[ 7xP-PCiUql\i`af^9H\fQ1H}g@K(Oq Y%rD}Bj$)kB}_ xz7jb V1]U-mT(ڱ<.y1k1*ʯN."h^q;'ˎHi uRi)4?9JêCHu.,$t{ᔤV9ϑӆ }gXM=L@TlN>b zEJV{~zFw0 B/GF,UU#;j*Uvb}fc+PT[\mj*Rڟݳ5ts*3{PUWiVmU =g?!T'g(w=i`,GXrȔ<4LZc+%l$cmLFPtS" pt+V+<[je(iÐd ^|3 * A@Na]g,7 %Cfޥ4>cK(ր'":N [dj5m[DyO$>$x"0t |WTqZp>a+ZGynOP/`o.H bTg#Gn6|+ 1S^2$\&&ta&=m?B!v0>>E&v*@Fq y gGg!δNHUa=gp,mz(Zf{¨Xz B;:V?@d6D6fqx0Y؆qxXmqM WŤ}ZD#Z?["I>sPcKg֚ K|M[!LCͱH(@{x#o+cD@Ƣ~2rpT[?R#ePjr\ [4ZTKMFzt*UvGkMg~h4>s[nE%mLVbn+Y{||kϘA*vEw}T( A'>cI;DiߣJ[ hVŦcsnǾV0QPW qib4ʞ38SFp~piHK8#ch+ڭg69s&gd̲/K-oZ{ ϛ5} Ɂ ieTDS!i۽KD 5 Iqle1, < G FB&řGK$*ѯ *7)NRO?mv{(d;KJQ6q l̈fxz7˔_}T'KA&YQ`K'88c6a-*0޽ᔷ!6 h~5750.Q jՌO&!}M_Vȹװ%_q?{^ 0C[17}"q~y5 S*=͜kG٣21N/E~C[IL= =*ѢXckvu;߽[u;FquѻMc~Kk^~ﺷw,r*eϮa=}gp,xa֠ұe}ETگ2;ǩ^`D xk}r28<0]hxH;9dt\q Z*QǛ|}g^Y`h噅W {X'~=i*uOaME;Iʃt;)A6cP+AqKCZdTt-z @<W,l3v/d PQʹL9<)jbXf28 "SB(\*6w& VoE c2xa{psmvS2y(?cFuۃUo﨤{b^Z񵕿N| IE:YBJ|gj(Fp_I"(bXeOv?B .8/~V 9Bѷq DydIJId |>&x/&J¤I1Jm0n+AD}@3m`R0̟g*c?+3Jk?&3!^Bx{1 vmzAwG߮HZF=RU 1!RλgʶYJ;[m=٫ j$_5ADFk}ڌjfVO>tUOX($2؅ ޠُ`D /AV Q9]($M} mm"2$4Iob7$g{@ dK ,81,1,Gf +M}3? Ohuo*6-j,u;Z,z θP*>~] +N*tcm* [R.ai𓚢_#~`o*ॷ ({f/?BءX9蕿{CQ8e1, < S,)zo)ϴD.ܟU[B2x ,4/IGZR?S[~Zgq۹X4 "xyX:G2l2𼥉.{PcY @Ǣ䒥6$ !lg+TZbk)Cm[_pU[~GW |s|h+6*[>^uέ0^O[m7]un*کeZm~}f >cxC[18 nˆ@/8 0>md2\HY2Pa?|(v[&G e6~xƵWY24g+6<@yA?3q~2g<+?}3*)K)h(UCQjT7^6eY @Ǣv\!{k\ U~TOmڋ9@wv鶢>_D5і0Jm:-*74J Nx9UcP`ʙfu/32 A|LaPT-Eٯ0} ?$!dV+JG긂;4 (Հ}tQ1b|T=7Ht5VQx+TݿJkAf*g06tMݖ6_p"%ISm`+ -ݗߘ,xoD74B頑Je1, < D?} K/ F~}Lr/E'!DV" ]$ +6*bXf28~ȐMeYJ$~8Vڼɺ2io$v-QG墠.bYke>Q4rҼhG;mTU 0MBfahxuE0gh)R~pqmKk%Wt*ϗBHO~en2PF]Yz km`eWzzV1 [lĆ#*6#OD۪Wh?s[nοxT!lҨRlta5s[O BT3D B.GwzǞvz/ޣ~F!W(k)Ov3ezz x}?eB?uzovsZO½60UY jբ㨪4Q7QUwQFoV_Vm iɊF{|3 ڱJ8еCTVŰʮ3xsLj.c?3ѡg'2zk8#*Uv߼z0D9|U=X!'jfgbXf2x{;63gn* nX267ig.`#\ds*`VӻUb6?Ecl]) ;`[l+uOnsj*VbMr % U+i8!QҨP5] KWc4%5 HIaΑjǩQֆDebFVsrʹeFR  鹤kX m*}7Bw X F :*/|~]A}j_j^.6)Xx1-}%@1Hj,עv8@;t2omZVĬ *ZWA!:0{h ah` 6\Z=:``}we!֮sRB5:C-oYF6VŰruh75m~9M[\> 2Ci+JL(D Jʗ|b U1 ! i9jyr#3{.Dzz7yp8`cuUs!AQmU =g9*2z,2@Lɜcbeyz`I$BܵJ$p]A«JLrőU[?cҡjP\Cs cVXH=m)߈sEYK2\:uֱjFC<mE=r(M3, i*FWY׺"ae| 9's$_c8fe>wU~tl-ـs[gjٰ"۰>m^/cK!쫱G6֖iזG[ ?Sm;p)72c޺~(B1],KlUtu?H0j2NeO:ȨEF@?C}:pn+ৗ`D͕&CAԖW9{sH,TIi_B(NՋwKUߡQXmϵ/P ;Vu +5ȫ*_GVQ <@F =zNܪ"5AVO> FbUΦz"*IϾSm(UUjK\{ }Bt՞8`UkhJ GfQ[ID oΔiͬ܋m=[foN ;waڢv2j+Wg2X,:Bo}\$VK" >V|2F)Ej:Hc&ȴ?l:B^w& 0:K~N=qB4GH9:v\$Cz;]>Rk*Q1 ܚ*՞b ғ)skbX:X^Kù)POeU ikzRQ ϯߛ x}.4U'OU9p} ͱnYCK6Ȼ<ϐmW8j-n5)@ץN&c WtAbݞϺ|շUWyF/lC[|@e>ϾC Bꝛ xLӵJ}c}zW/gL-CGgm/Vg̣Πa~jnh1Ø[;\;I<4q24+' &sr*!W+W02 Kf KZ⣬aVf'u)  q,#KEs| ;*p2PYjָLB|U1 @ZtCP7zݻcdPi8Ƿ{u? 979{طUΆH\FsE5 ¶hiA¶&BzR D[fԳHFN/h}c5OTk꠭gvrfs4{5eS$V޳Sc 7R,uf(\ug xϤ.),2!II3k{^ PVb$V^$*@!Ui+Wr]M<"^ZD$M)Rz8M45GVxh(IbPs~ouL_Zb!HJG~(/ENOERg&/*b.n;ewBSNK8"(19z6)L#;d30TAi± qddeT #W 5I̶V9P`]g,০I/}o攽dFu~Rv l|SQVmo耿vq;ysEi֭Ʈ.&^zcjbXf2x3H~Dhh,"!R趢@^OGZFa6._[g-Zt]?cU |ΑOS/'Rz>YqKU ,Jrl+x3P;8){dh֭Bx":.ڬTFcA4ǭGvn DѯS 1Y |߳X|(i aʇJFgR-V-veD\+A^?[NEU[?ĝ6着C̐wϠmy0qY,W.QyS.,T N dsXl}fIy ?Ƅ.[p1#i*Uv_ګyM95Z^)V3xszbēDLt.agHQgiom2*Q82B_YIB[ۅj< g"ROHO3j*vp6Y nF Sn[Ox4ȡ8*~ڨ{%DZװiU>̔zH*aL Mv}6*h=]gW \_Z@#KqF28) =@za䱿wf@l0Ƽ.Y "mQ~HC@h]WiBD3oGZh0#j+c1Jz&"OSPC2`A=yW0 чc]g,2qU ƈ"F[*zYu4ЮE㕋{'~t* H*-uĸĄKGͨ^ Pgmpg)͚W)]L)}mW5-wnpDgXlU| Q TՕcM !nrgaQ ܃awtlgVsܿD Xo]HZ@({h|`b DsyrUy%*)!Vf)3{S#öwj۷=V>"H yGn ێd\s3,xmy&D^VON.S!gͩ*HG OCG$e l™̓͌,|ڼP/]4TQ(SY ibX|gDlyO=LqpϨ;qV%x6wF=Piu)oN,a]WYOc29K)]t5dr!Yb H;kTF0ʞ38pg ͂-VBaIcm.dhfKq,VOF3 !2lc)DK iAAs^ֳTel:9QOִU1|g,Uv0C+Bͧ1lA[1,fEW4؟mU`Ml+TmJdE j+ڭmk3/,A+Sms$luag7٪127$T-`n+61r"} )TQZއ;΍#bW[wSŰ̮+d,7?6܌Z[VUfTYpFVxHX,XWokBt >ehG[qu6=aW#YczߵPO~@JHqP`[]ViWڸ XidJq\Kϴ;1BǯIDnf`, nvJT7"D^ΟѻOKrQ,AȪ6[F XD{1Af 0 Ci5ʀL%16(؀* g<gKuC%EhLl9Xf2xsL=~Q ~`U S~N鐟Ő9OVH56BwcL627֖vvث8 $U'b[h7UlĞ]!kC_Y;pSJ&P r);_US1y 'tTR2ą_ m=EF:<ڜOn!3S !VZ&Ո2׆  ]P7Ej^fl gAt h08E^o:goA~v:!ڊvkcekkaMŰ̮+d,o#sR}n+׿B`YXg:>V!ЪkIc)9-Q; Ҍ'-C\UÔlCefW|D:.aj]Y5̠q4έߩƲ?4ӯ }IRq>ò QBvB FzCu]hʩnfHip*JvAtoQ1 ◅^дbXU }]r6*%l <sEAAI! T,;yV<̴"}텳`Lщz*:&:Q \hͣlH[r_s'4'OMC!lC@&bS|_ a8:L?Ox/D" +.t \H/ mj6<7FvZ]cP_sgY:, ,d(ʳ*#%N-[Mj+/k009kTQONCeT[? 8r)z$(qm惉^&|g=TbzJ VQC:"jy0}eamɵ?!&g 7Z6/9-!87W ~f.v<ޖqW>m/ b2,a<9U bxut[? `!ux nH 虶ؽ8N~ÏĶԞ-erG!r=3X2м+pJ/%/eī~lAyʝ7.0^XD|9,q\![W wMK4\ P~7P$oFwnG -0eէĉGo#̷_\aUjj0v?ũrh2-!d8ޯՕ58 ʲu p uW5VO-}{s K͂+{OGM4cIVb]NpmDZeW< b%diҊ-޺] Jo=|~`&ٶ:Trqp [F'߰ry9xJH0AU:Nn&,3n}) 3]9lN(vVXP< ޻ẏ ( Iw|(D8d[qg3%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>g#qVpNa4uZCB?[G<񰇒Iɓ3V nP׼=$0+TsTP:XwUԘ&IE\Ebs(CsXy쩣?;%6gvmi:pCupԹ+gы#a4s5,+_e1#\^؏1½ ¢;!+:&;VcHh#gG+0ZXzW8ڟ@XY^RntVXP< 9m~lJK\ 5fƱ3Z9V9RyGnaׯwc}JZ쑩V/|ڳ ip [VZKyjUoSF&%C,jm Kgwe~5p̒j!'cO]Ps*J%Hm,ɱ̡'d$ |FKW+AH< c)&5`塹YCtEԊ Zc#gp$V$ir%J?m\6q[\IVXjI7QFTCݒ=`4l|]);ۋ_E2V>+%IuV&> cT5/}-sUO{c(zxJ`&#V)ђ($7}*M̌| T  >>5P$Q"*jI7LWL#GN.K[)[Fj\k1tgZ{G9xdm^gIe=!'߸ƤQb6eRп*GJ[`( 9t;zIc'-ҏ!˭zΏji_t4xO!_V9n j})Rl+#k54*M#:Hrh&:K?:`3ZBı GUzgP>S՜Ds[ݩN@6edڛ{LilYyjK~emIoJ)"WbBW$tkhLŇ2nsi/DLMU<ˢTR͡gc#fnMlK"ANFAm_p#r 5f$x2~cwkmr[>]YܙxI"UMy𗰘SԼPUZ x'!F\6X=/ra_s` '7=K[W̜5$4̡u$pƐ4^{khAO~}m_EQCFx>ϒ40y՞4ϴEV Z^j&˵j՗2JLADmb'xBQNu֟ކSD=xtnL=saOfu9R}~dl&򄰛3Kq5z }F icf-JC[(v?Gh1ߖi^l3I2ʛxl<4 S֏nV-6ÉAy%-#`-+( 2~ %7H ]K-u-ɮg>2?w;dYreKkCg$kȽpFES"74r(b( }^"~w20Cg,IpR~tWFৱ\:X]6՟Y҆zL>cHa ~dZ b$/HmHR+#zN;ǴGw/7([~G9k򑝩HOl%8Of.| ȸ8)#k?c*&$/\FB(TqP>P5|w[T DI\TKFo8&5_J`8>oHjڔwj#g(#MRC>aL5]8D̖@OW[ ~ ;|mqAOq5 _%Y;E{"NqfBuNbBtX<^]=b(1ڰ?-\ St}nuK|OìPUnC> ]Oj݁Hl, ё-ylNG='tLN]K&[&v͐Χ"^|a ͔DVs+ÿҿ2و==оޟ)qO>1@:yO"enܶ59ǽ,x3p!-WƶǒsMm-WӿooV䞵I 73~`3EjNի䳤5iB @~oBE5CsAqߍ#z*Ai^HoDDnmHmqnn"+,o+v}M膇Hu̍ (u0e~mڑ倩{\ N#b[{+qp RV]_{A#)¦I)iu3gÚTHڑn,~}u=uLp,"Y2l=}Fye?7[Xx=M&_+Kfvg1ʑ38Vbףh9+gU^S.PYa֊PɺX"P ($*4d/ \{|8K$R'aZї*W_@>p~XY5jsִZd͊Rt>[u6io?mv3x!䠑Mg8 |׺~:dxs)MfOmu/ns1Z*5&8.羖kVc޼]Jw[)!ĀSrL\^-`no=v`ҶSz9`0216=F35SUʻ:!՞ov?L1:ޫ)"^r'KۖrJ)2F$ltI=tnIBDW_qq NJ7+ؖ\6eds9^/wAūE܅.ڟĶ׿KJ-;/VSG+rr ~CB1cx狏'\ۖͻv^޵1ubm >٭gt~qw ܙv֖>F r@]O\N $/bN|bPu+uk;'`I>'m ukAɨ;ZvqR~u8sZˎƟ[c-=biN A􁊟Ox*sBO+3/j8_ 12Ld WjѕVh7M k#4~cqLK\FQI:ע9[lSF(N#:4brŽ4#`l<$RMᕙ%2RWD~Q`$oaϕ$Ou|Q7 .1y9`_=Fr;i m/~h`%0.mzV>.n4k32e/u}3{䖴/d=okvxbJ0J&/=' #)g^$޳ԌñOM%u'.zcWu#v15e>v a^k6ΌV]r $ypt7e,b2`ώ%uejҟjo}C_FM]2CM\Z1)ڸuӧ#/w2>S:fCB>[?^Wt0ZmCYW *Ȳ4XZh@pJ6 V6[ٶkZpQb\FH ̏hl=xrRys9WwS0nwyĈ ??(F!FŢ++Bm9_[='wd30iu{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ٮ#rHTXcCOIFa]99`=?!Bޱܧ7N݅4ƑoAH3ޥ "cyK?7ڣd>dɬ{{ApF*}vÆguVLEeTt.BxFt|!Z&-]/Kn"oUՕ3A)}s(C1"5rGr3Vof6X Gl{w({@9XJ}En X'4T*BnEcɠ;Ff"xҩ%=j]'we~e'dIN%95SSF>Q@{ϑoG*Y1ȃئ> V uޕCd.@O9 KJ@y ?;7%R KE.2XH9H.'嘊j&CMU2DSԘȱUgpiN8kKA3e~yۧ-ff9ƈ3EE@Vz#O?A>S3Y2`Hc׬F^ZҿJNN]俑{ $pEۅ"^z'DY;.P!N$$;p=^>&oYН66,s < Hyfm\O[I79TJRӼFڳ?"]ruí2 }!VzHOv.j >%^՚Z1^zת1WiZ3Cc ^@օy;ClU6Ƕ̟al5mRVYTLKp.ʮ`˞v<`]l%wGQ73!r`TF#rr n|wVF(s*9#ɼZ+r5^gGmMřWi:fǨ~:B(?k|{J(7p_iX d\58dًtFVk,ɱ=!'閻y}=*> Rw1Еi*(ͨb7oXF\ Ow'c({7vd (l%=ɘd-Ԝ6𒤖V!'JfD*m޲ND:ΒzBO?K%&f!~y}Xv-`j~JZud%ۂN2zYq:+͈g3 XquX2x4'gi{tLyíp um9^lݘݧ*/ ,y^ow?~ZCJð~ # Hv!4DH wK8bLE}3}ADqYeYDvPȺUs.X2H&5e~Ega]%!;ưedޖlaudmen;D!H'08'1:J#Aeab̿ cޞ,#{* ?#~ 02IZ^~OSaicKٰS2e~)v8 t=gsfGyQ<M}jbkzTT\5 =C#d4Yj^Z$퐊2e~meG sOW G_\zk nFɑEܮEvOȞ:ij"RfϓoȖ)Uf7KqpZe~.>.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:C"Lhg&ÿx _Z+P5qo=h{h6=\7kCg$Wc`k46w{bs>8hDQԝ\U@g\lipӰb7~ݴk_FF9TwnWā'%AҵT2[C2܇Qlᡌ\b~Ll.$RhVrqQ|o e <noqO{KU>08遇7ۻN2WʙKӔuU՞O3d 侔mEms[6Ɗ='_` 9'{{ mM>XPȃ"K!(K1\i2~%99 ~C8a/~EP"j0_{a .q:E2uz\@^wm{ da ח!5ɔ_wjVd;5璌x-­s_Yi-veboQ'Dq]쭡*]we~vׁDKgݔ欢>~9iLΧusbǪK6sz;Lg9շ1276L樂zgv_{#)Iz Jpcp$v4&6?mz U;%ӮIz)hM/N*"tlz?kDnnh^{mA +{Gsٿ_6JG3&2?Ѳ2UYc!#HVƣh-1flS)4p/t|,d8(nlx~ϼwT䬕+tYkEF^qR|z Ɛ?#[ /[_гVXjI7 ]{COCc CEG2nډ4'k W' /*`'#Cf7ő(!yQDK*jI*&@1Mý*XW*TyG2atW#esKur)XHALz=e(`̾i.#2z;4}?`J]fHWFO$鉎B|oX̓.?6Bf!zOZcCOIgõ);L/cyS=A@GwWpc BoQ/+zI' b^៹p ڟIAso%h79.9kNI+SH KY,G+rܓ,Ԟ?v \@a,TqÖUGpiGUyhHa ncЂm3h^k:Kw]ЕI+ahh7%ErnqӖ vэwMnܖUܔu&AGN=2Aiu+mW|co}Y7 ׂSu/7FP y,"2K~}%*U3IWU3MGYCB?[G7s<s-_o ~o h[V|;?< M=?6<3='2nu6Em4edRYuXOeX?RCYT2d=_0!]r,5ܙHoMzYzXc#H3d^U}"d1XFזM縠WeAa2tEd ><^]&rY;4+.D+rΞh$2YmZպVjJ"6BY0/rUƔAtze !wX#J.aJtC>0%"/_qolV2kN֨$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!8ocuXjۻYcCg$e Ç5(Yf $;$|p-"p#*+wIx7%AB.3"j,>U7!$Po71 %^dc*:f*=&A1HDGm 1̑38XD63h#CG E ,s )%g 8NŹZPFM+Y<;ۦIzodC?|}h6c!uM⻹Ss7:Dad~o Rctiz(2n6aOh!H{:JoXKᵌ'M.?%{wa8>-#VnZ3`^xgٺ+#kVWb]JZifz_3]uYӴ8w2d揆H ̹ .,2ZMk"3+G*g Yc{BO G'[R ^WKG͋*W|! |0M֊Pɺ_"W` ߫*dec3۷o0e~l似 JT67ςn=i廷*;̎xfZWCq|q.;j@?&~f>i߭Yw<}ᤗЙY'?8k`!|g- A>o5SV4tc}SQ-n7޳Z'vC"/62<_cP'=n5J7}"L>864#řgU۪^kڊ,&qӽ#Op̍ļVKNOoHx-`a|YOcEU՞o\Yߏ>ֆu**kC2?@K}apGwK8-T ] xCas2?@8% eyVf!NU9dj> ᭏4woa#O/ف% _ XEﮬwN9Kl6Q( tO'}wm(Pjڀٙ%>:Ԯ\vfO/_Z)l6uN]skk5soW(3ۖ ~R&{vmd$H#0sɇn)wt2}_28bqN?E^f^Ӵ^½Ϝ-t)GAY[sZvXcCOI7LbRF URK7(#Gw9%1]~0"baQǼ4ܥe v^ 8GДivgһ`FCXBJ7}:X.~*-qqbNu!a՟#w8w٩2G]ۋ.TՕ0b3\wQqNZɺN9psd̑dp$FIk:sIU[SOS*֊X< [#£wXܛY[H.f}{.쥣 MԜ0s$oe,mܛK5=sHZ-W` w3%bKro2A%99 ~0{1ǡ$O]W^tU 9LD'$օOv=X&"<#Ƅ`ĊJS*myؕ5+##V5Δ+)yOp^p=J.Y7Dy+#_2Q0xG 4gRިG×tݔyK0Ov_)bHپɉǵ[P7a\@MqWǴ?*@E4N7e~jL|luѧp+wE |z//~z(ulK[+֭],!du @l]%[eDRr:mXcIe=!'Vhf ܮ.? `3LJ(2֊=' ܁Fph}Uw_جlk][^H3ߡzMȚJCj5+7M^_J[7̮(zJ)1ذm'^& NB]nJD0RCc ٣66~eC2bV$8peWC_SxB؟~d2*b)ܘ 9p|k>JzG!M~B7Bv^POJOQ$۞&0Z2Vg`xE`0UFFԞma_p"&H4<Ǡ]O z9Fl.d2'rs҈ib%pXY쵈L7_UYƶ$2ohl jjێ&i&"gBk鼗wM f;uf]c49xU$EKˏe~b5{k xz&n9Ѽrnmi4̑38ۢxE2z1WKڥY(VɻmW5hD6DzGxa3AfmI@^zWNּx`6edخ܏ ũUs ZW a%q6҈SiĖP>G *b|WϞlX8fcl1^8rp3SFg(qr˹ BDxD^ca\3_ZTX2xaNh7@-Jݎ^=.wŦZj ǽ{95h|B? {[?5$MRȥ5'P_aBo5VXP< @Iήw@.(IXelu!'Hht !\౛:,'5 XKr,s < عn?< 9Gp Yc.Tku+zvEרlw)#C2&0EV~"wh%<'{#sjb1Nj"B; ~yֹ }H[bk&SFgO;'OyT_YN2G)>'=1F Jrmv+70Evdgζ$HRjwD8`4'Y"xe*zuuXwuue~v/ .^_ix{"*G*Hm<`<Ћ6ǡo'y4M]V2 ~rbI 1͌/9&3Q3Je.Qҝw>+eU#rr ~dl$P{ zIn3 WEkWUY+qW /+6<mUBKd3e~pv$ٌ}/Lkw]3wj3g _8lLE |Yu\0XcCg$ ^se8<7C=ŒםDپՊ̲}*^o3nLΒy@GncK#k\= Lq; S3˕DY9}26/讱O.ԸX—GiŮ 4 OTׄ ̵p?fd>]HM/I#[/:1A.N5ܻHժqNA* .&+@xtrع* .kʪ]IǒzBOre? xrؓ n|$ee09y_` @^q3c9/.7~mmXBxVjSFfI:z5T;B[FޞH 1g5Ԯ;4E^Ti󮁔`qqO=LWnCm}Yѽp.j\rrtYZh5b^jOVc5nfS<`ÉhAkQTY/ .$wyJ%8YʍiNw~2C_T90P{TàNtz+R{Џ+⬶b4E+#$'IB"lds^zߛ2AWƜĢxd pފ㓯j-ɱ̑dp$fw#- Ǿ!VnԘ q\QY6eoj$.cxBTs!LG:ܓ!G!LVx `>iJ,ߟSa[B ߖuj{Ƴ$2'4b^I#ڒCP_Q*0~t`MC@"@Z {㧒 '/OR)㧞F$A}rOWqEsj=ڥ)//8>_ˡ*msUĮ9Q ޞ󘔷ߞd CaC-)3cgeZZaJkeY;nNao4D(0D~A)Hd=4ЛrhS,G+g>!n 3'ާ"M1̵<0ԓ7Io2HT7&afl2R&{]A'͔0ڌ YCڏgW rt?6*xu27í98)7l#4b #_L@fk,ɱ)62xuH9w`6 ҪM1 ԛn6HGljFKa cS=FdX@縯o@ 9aQ?f\x^mΫ)I9j`#ugٸ} 5AȓIsCDZIyI㜌>F^YV6.7`>:ᣗOJH㬁#rgEGg$b (˴B Nr?PI ԒZ(#kEU՞u; T*zrd )4w@cꠥ6VXP< !V?uqpL?3娽igEU ~&JűnԬ_ ui0V2sYIYQs6O2mע"S-#u$C^,)㶌. ?U%p?Sl, |t}Ifhj.YJD6X2x;X&&:i*[^72r5Tdzee6=@ >Ozͪ ((jMj$fClt{R_Ix^ =(]א5ؑc=Wvʫ}ƇAFJb(QwyK냽Eo< 3Z|5~f;war,Q_'U(AHɵn2wikuƯMIqܪ~SF@ܲU ֿU|axj2ƹXB\, 7۱Lq6n5Z=:]&HP#~|/ljmw5j )#Sh/xGj(ѩ ,{03kg֕VF.ldXDƱHGFʃt$Gw'PxVڳ׵~*:9i$g;@ogi%2?2yKw=XOc)˾|fUER)Z$\2<qЌhvJiRd]]D9R2=tF@MpJV<ȶr,#ӅuF>/cTdF!h[Nz\yw> cE*VGc_^a^y_{HvH^4 ogIN$]Xr'd7hE'@O_~`n =nZ^ +q%a,\Y2?3 yǿ׬WAX;7gw bf?OPttB=5XmQ>"V"f &'3f&ByFR,4)QȁFtEtpUys%UΔu3m9cLiM$o1cQ|Sg26;ђzBOf)G纘fڛ&&ʕecEU ~ofRZ}sMs5/?;;*%mkEa9ZGc((;rve~v,v"`Y</rκefȺ鲳z 9Ꚉ,^ov,#c+q˥Gco՗x""g"CHESb E^I+(/SF'ꖆ1݋>E^s]1FlX,-Q(?+rE#,8Υ2^|nA }=?ypJa\[ ^Nj`0$ϭqI^jDBnnCH%Y|MPF֭$Fऺ;̂| 9aEF`p7oGd\}:~eu3)Lyq)E[S2?9͊iR6B L% a6NJmt|(UukU#Abu6(n̶_YlY734(H8YGاwsIHڟr3h;^p-5)a< (:zEG?+#'NxDs2p1tY{7Z\L\;wPm=yjqݱDGX$+E._ocb]]GoIX4 t_o Bxx}Q YoȑrP{_L<_BnȇIۅIwU$M$ec'G˵fy/^Y D(TBuHօ&P!<uruIGv/^wFZʩqUIp;$s RHP4 f{߅H>'w6yŒ+"_/vPkӹ@&㿦*!e4(5s7ݛy3TƛǏ'+l6?o2x=šwSŌ!+[ Oe"7O ʓYV*SӉ"*;0ॄ +}6r@+a/jSz+ٸy5?Gu$ɑ, (U}c<f~ȥU[,lk3"*t_fFݨ*u @oy#{Uց~ΥqU9ּOp?}ת\+[L)#S\*VGwembd?\5'>da'Ȕ$aɊ <<@ Ó5z(c}u]Pbg# u6cmX udOrL]U2 -0)Aj`)m? 7&f$Xop7h"m44_}Pk"+Pm9mz6͒A+~ڋzP [|,'(ߘއW9tkʥW?#Id4P@vMSwxurt ZHebf0+svn0c䏬@ ii5`xx9PH'5ISA0TrP':d4 ꨇH$#P#2i}ܫ_Z9Tښ QOez09 3qe ,I.7aB{z0s¢fdpEr㥌;hퟭ@I ]G"̀2@P@O^=R!\:򰘆2<xﲵ_b\u*#%.Z0e9WLf ޘ#`sf뒨VE/+!mM^o%3[~ I|m~[M?Y@6)_5إNW[FVl!-kGct'= >ƌ16ӡk:/wz=|@ųiyGP#vE0Lm OEZd I8TF/ՠ-Le-} EZ&1qoZM ۫4hB1_[B\DS@zhpV+abeh](0-w PDK쁴]rdB@AԞ"  WN%`26+uWljѰ7vd O꾴-.WwKN'Hϕezfo=t$-( jS[]pB5se:2%Tj!/1o7s>ՋQRɛ<o*"'aZNϰ2aN}IIAQ z1R$"覽weT:4O❈P:m-~_wjJwƠğdnj^F2WONfip*oɀked*殽]`<*;9D>"T $ PVWHK*ӮA>P0=jOΏBI+t~VМ(3K̳>kX<gX %0B _f SG&|AGTBv7vMBP%\֖V_YYtd:O]C^Z35Cv \ ^ w2qj$>'v@ %h51}ST3gE sߐy[Zl~K'o8GK.eSFt TYlq|,޿7|1VId-6,%,%J.N)ݻY=:[IDPsJ"d0SLE^SסY'SQC׷^թj|j~O||S}r_}|tz,'Gğ Kb b_!‡,0- Ŕzsx}?jpkx+cVvM#nhZ/u]KƔU]Zt(\,L^ܴh)p~8oFEOl CU0 uǑː]9Ϲ[2jxϖMuPa2j8 V]:A\FĐx(`v lFO\-ɿHuU[\De+mNq <تdird@R@O{Yūt%?d̥_2=j.6bS!Up*/EԳc_oh1ϵ>9#-g.ڤG&ݬ.$(`,3H#UB$ЛS@,_eȻBun jA>?]#g߀`IjV7=[G%[Gy~y^LVj&'3<-_csC"~'C$_nh:,^SyP* UY լFV)0`F5eNLwk[Tr鉏mݐD_=IXvX)rJd@DJDM6UcmB&(QXvh#Cʶ\:5)"вl4x|4Ku{?!]lR g$GD(HVm~<"ƺc[rTz( 'sb\c{X l/] kk#B4@ezufyrQ2@--˔U)RIA~=-ez?KlW%/3CPb7noiނ7ybTKcb} Mn$ɑ, h 3H}H8$xR|$C_ 8>cϚb^|Q{.Qk#)oeZ B.A\dlnU?r~ϑS@-W?t1CL<td P@@׵q?%J{/aH{?1VDyL*4+w?qPoRguVo{.o P#';֊ ZSJ1=M){' (;gE,bXM7o,pud_b! 1Y;W{nb)l~9sΧg˱3ϿVY-xEll,ܫFQ0]Ok(]KO'.C+ETzfrl˖yE4?^w9-{6cG:V~y[P 2jv6|o lajgFX ]f5%ӿ`L{%]y\>F:K Zi80yBɧ/<57o:Ωoi @M9Tu3'b8OY!YpH%ɕ2Gef$,U$P32}N,5bȓlwZUѽ7P=ktV$bn^f%xQE)~wzfәe<sO<3pĢF&[:уHDu:1'kH ڶzscF)"dzez}KOA9ǐU!Nk5_է5HP 4 3:~$XhMv9O>EZOMQ}6^ KRR <kt_%5Ә@˨<>WZ&*RТ ?3ұޫ\֠)!5h.Cpk c8b})p*12:?5{Oh +!P5Pdž{3Ut_HKyy@+}T7fIxm^lc9mAn) uG^f&5I1?u%6yyVMRhhM[ԯ#@wPU7IulCNZNu\I 6‰mʔc.R [j*U?@5ӻλ4}K`/~'f3hx2jU) b7) Tbig//" >A#iJ P@), h,],ap E>Xnvﰃ}^:ItՠK J+G~,ET ^@@oۅ<fg`G-E[lƦ@h-Iw{7eEM7㜷؛2>Tu[7 n X-4W<dF0K#k&^a,lnRsV7"dpRpXwCv[ĤTT&PF^zx??|k]0h|Oļ_ٙo%_eHasZgDi^~Oq9;U0ݍ%/XSFEPJw$o[@>;c%Zi90`Ɂ r ˇC1w>s^렍*{&^m$Rj"*][ ` _"ǭm[U:xfPFiGq9o3@Ud~l0`8I jy.%?|vܳr (hO:W9B%Pu=Zf*XUϕKBo/Phf4o.%9%62U-#33ڠ_܂+ӷsZ*B2;$>hZy7gFQ&'PB+G&ؖϐhˌu18bl֍$9 (UR'l/e&:]-#=hN*qy-ʔm~=o[ň=f2ٷ?RN`&J41m%%P6ϣC.|zP>K0ơ@O;OĜ¢ŊѢt oBOM)̈3hF2NNSR捖PFQ-T@d _޼. >\N|=v(#3Wnт N4M aK冹򔼌Y/V@:U0ѻTm0 N]"ڼx,1xUGPF7:&E8޼"\6"|pp$=:(ed^k_W1/foQeȂYu oK[bGp AJFP7ھQI 䆳UmKu2uٕ;BZh(~rSKE9fm`Yդ)sJ֒;Ӆ)"hdD܏=n̘rOa#_w3=<\U)mKr^l-#oz Cüu# Sr|S0nw.#S)CԐP$,f@_bH$Ҁ12/v#@2jwrJt)szC#Ęt!v#iziuV[v.gٙ3_XWȐH#Y" P$[|C13ù3Mc3bLFGRǦRl\ƽrg"zV;7\t̖C]g)rJzDDgԍه_|x8&o$\-x1^( _?n9znUj'Z//HH EV,:5cg0In6xE:  P*X–1SF/5i-WX)rJzǎqL'GNK,Co;ЉL "zsb#򉇏ZA~8!8p(:RՌ 5yז=vsG"LFy"*2gB|$b]!;SuUUL<+D(TBuH60CIXe~]*fx-#kR}?ѝ])[e/Iű@﷕faOkyM˧> 3zi8V0B+2?GW oj[h}"gLh#dȪukttzS@O!\djmd sq-#u,5wV;͔US'D_bՇc()0z"OXy+ ȟT{ p{y8,ѽAZ|k(#V][0\ 8S"Bhtx{W}>{N|PF[|qo൛܅HǛ f#|[ ڼBEϺZo]vL/Q~w#{<#+C$Kp7Y?eNH{?K RZZ! &$Gv1GBNctcĔ7/3"2Z׍3R8sǬRoxsIV>)i*;ۑzYT-eWO7ƪYm0wuSg-hIr$Kz]*o*t ES8*:ib$Л a>1)|폅ƔIgSAiHz9zb?:ہ?dlɑI4Έ&{=1x# x0{mmȑ* hAw.B:C:e].`obhYsy1@bK0S/ۤzA:~B#Ōvc-]b ,W~YNʹT3+g~0?32z\PFgzdbBҳk6{ "Gj/Il霨PB iV̚!TH#k&^dNYqєB "\ZJ8K&qD$U+byk}5",SFlSA{ܽOnIt=x@KPutaV5=>r,G1K2>:s/CƜ2:L; o {EĎ3;< ؼq*V\(ba\ԸMyXTnf1k.9R h=i[Gbi*@פ3.']u]z甤KmI֣Riȑ^@@x:{5=~ ڛԁPuQ=d=T֫jސ;6]g*1;}mG8d/g+e:P`  "QZ(G?XW\xs}xĜ7r~ o. Z# Ɍz#d$08oT59ULU&r(5ww~Y1t-.N\9LBH Ԧ9 ޶+^lV(!)"b!),Omq 'ө5al ӣ]?sA\Kb90HP 4 l/8ZWwgW!Ξ پucMHP 4 H jVŠګd.#Ѓ:q5x]ńO6~aHyQ=c {jѬc;E:РM^8<6)dϿx}c Z0&h=^di.xY_F=R7}zZ{Vv{n{V&1^3ht/DO"?@lr$Id P@@YԗͰ.ƻVCyfb_YFHfJb 7/VCNq,/M^uNX܅͕UÛ٦Ye/@Ƅa5P<g.×dKazn vVα)#[ʝ1mv~RCR2=B&`?r0:i]~>\z@:+s?4oSFWk-Zű@K ̢X0:XǍavK9P~cVN9~ 2z믺[302^{`DK ]0't!DVŒf ᔞzDQ" * "1"2?lw@I} /3eReי=Bmc]g{U}~SDU2@"qCfh)Z)U1Wѻzmۧc!~sZC\4g03fD_Zc%ɑ, hw{TqQ?=3W/Cgez!?^zAM5Ϗu^*.5 ?heဍ k/N- Z-c0tp^jFs8HTbxRufս+CzsODz11ՓS}Ȱ 7k9*5.f#DzLm9ʟ69R%T{M=gV-V-# ,xY~L13kc8K-Fo0qg#rM^xvplxd7L' q><4\0YB |"]zoNX;[녓J?FҿEZ𮏞{Ƚ XvGF Pc4ǙS ߪM9A+19\y}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謡@φoY}2k\~Uu:2j욑yb?wGR q/Jq˟o7cIuOx1b^Rikesm4%BMlosz6 ʛ@)8QxJ#D(TBuHfNP7@,@vvѥ7E~ҳ޴xǩ[ҙShwE[FakV.^WM(]$GZ(Idײ{䁵gdfEYI(` O S"5Gex~e)c t +RDjR)1lFl;Qm:+ƱTEez3/[7&o{_[o+IdddT{KN4^=B]p 3A꧟}dkO+oԇ=KI?.˞dI ~,ms$av n`t#h~o!$:=+r^;ˡAWo4q1P7r͡T`%U~Lyq9yFG z (4 Z"lnP#~W .gr\<$bXKgB)Nn/x `22樓X5 nn$w,ó@ta:x .0>vٖXTuB13J iNKjϱޏ PAp@FoS^~G"GW]@f%Hn X 2S%_V WVg)ۀ Yd& ;FߵPqx2*Q3 ʉQX?֭fN*+woH#Y" P$6u/t(*vě]\u{\㪟&S#$;cF @w.#`lB j |ף\ݦT--v+bR2S^hۦ?<[TD?jzcM?TnjQ}_'Ir$c-$Лx Ϩ$e(y~ZA~PMi>O l39_:\V)(2UJU7V0qumm5l"-sZA$4W}#au;Y0ɡ@K.ˢO޷a_s#\T3>CD|hYF2c:cZ)#{R զLez}vsҊοa)#+Wt3Z^2{ ]3ee90??-s xDz;6 ezZH >39"g줎m3f'KGk#Lko>!y6CbH"skP v6+H35ؽY\H Lz9r7ZKJls0Iy B DP?0P̓_e(#Sx4Puq tIԷƐF \ǃ_k%ɑt~o+FeF`.#?זsCtAࣼOPvsx֐ee >3/wϟ䧊rOQD}F-SH8fJcD9K/,ݬsN*%"V~;)#гw/;vq_riI]ws@6~0XE?`iq©Gp򋖿iJ|u_ៗ&|#C!n`%x$t5fC:OoNSiWM4㦌@ϺY"u'==2ܴ 9C掸y]'ʶϓs$GKy h>;vt 3Y;a2>$x,5,׼F琪TĖ.!Mȹ M+/pH2O`䟫$GZ(ID%pkgs졌@w[l1a ?;lIF0|a`D@ v0Iű~:x&Tj ptK+'= R5{F )jI&`-a,cdF51zי ΅Ɗ 2&I: S)GYj&ͯgl=cȑ^@ӏ՛yY@<9 HZˈ-;HUqD݅h8y"JvɑϞf5SFkOɕǯzn T sM &N.W26! c\q兒7ɧ=΂%T߿m;nJl8a JA.w2י%T 2%&uez˕B~F-ꘑ\@} As@?*eqDFM6!o;8_*϶MvRWٹG%Ö_˿.|zz/=&ߛ;2=J馡@^؈hQRg=5~̀/PaզIE6Ol-S&[Y p dn,lz[ȇ7YP/V@ }NZjUkϵyX/Ws˭9R h;nK zuvK܍]qתUuUvErHj s; 3o+9R%T{M=kY(i pb0BB%Twj]hC8%i^Z!Nsf68YY%UqfnV&|dJ$K2F~}xEt[P$kh>=b{>xCqB|&[;0U(V5n@@DB0D}zuP]{!k0rJ k3MFIi!zOBUtZCz\\F'Phۅ u )"^RGY< ,y bȜ'>lCv|)[F'7&yV^bȝnbBFaX޹-j֛Ӯ?z2'q̐j(#áү_ny܇yj S$}]_E=K=ᘝ]2ę[2^>#P\F?㬟[귞m]ԗ 9 (,g|j^eR]CYB"3{$~jʣyUcᡌ|.R ǢxKoj]ׁ΍Nro @xeeNhf=1edzMbkAHX7y1qհ>֫)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?uagJW9NBXP3qiIAj/I.‹ ivєk4^" =z!y뀘yGݱ۷UT6:9R^^@ӏ>L@Ra H_&<=Q>)V;n!7j$ɑ, hay[vWo8ÑAt(xB>G1r|+Tw54r %SPFRpbry繌kR ~.虑?ڍ&s: 4teOY*CYj%ɑ, h)`ScwhPNa9*lB%XOm ^^gL,EsY,CuRտOAfG!0x,OcQ38x񖋥mҡmP L T\Y%wXbwqޯF /3H$fMr)!Hdǝ)#ЋօcHԂ!4O҄$y2Tֿ 5b6[Ve:?c'0yjwFһ7n_sԕ?ZO%: 4jPT*RaaEӌ瓓-53x ך?")d P@@;% ,j%z_A06 ^@f^fd0mkhc¹Ȋb-d޻a$˟n铄g(Odѡ5BH]g2\]jrQsµ*=5~|!BXEynrV8'#s+PF'Ri$s0P?֤Z)"T'"3Vql+⦝𡌕̧pH#YB-$30%+s4Ry(X8VOOeiiyN$R{B;'7wb[%NHk* (Ah4DhIg\Iڇ2٧ S]9{U|k 2s"$,U$P9haC|&8|&٤K]<ƹG 5i3X@2b4͆rth~&/cՅ".]M5J#UB$3c;KsTpvp$ {]f{mV&Ǘ%uu6/q9JP4U0:&֠Vb(mZ^6[Ft3#D[.}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֎:)l`BY#_S_c^/|_C\$GZ(Ig ^JG,Z>R$}aFrqi<tH2l1oLS$ʨJl e_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 Ѭd [/bYjįGTj r?1Jw~v.ܟ ~ ~$^cȑ* hYkgҐRj?-O*}KHXg6M&tdÔL\F-$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.csr3G+sP98~pe]Z)rJzvLN8N^A}9i0[2|4+ET ^@@/0C* %S Bk!dgڑcC3ǻwrf%y^)18t'u.,!,,2r㧄ubXyi89R/LZ5Z%Kn%ɑ, h;t(Ǫv{r CYg(cc&)ˮbn8qLw#-)FK-JiFR_ԥt|FX4 93𝵬8YAFR,R>_qD3 ̙r]۩u"zbuHf6N 3;W!:M>2r$zb5IDl1L8ͥp]61uC  =Osv|CkW鋃'|U&:9R%T{Mz5gp^:?Lҩ sZffAg6u^ |,~jMmndY~L%]۫@I3#Gd6(bjU[F'4 GT8)Q+S41B ]Ba\qVվ^-#_+I_ֶ>@OnĜ[ įa_SC1Kݨh@#|}Spױ]o5VUF R# A /cfDn3ژv9[i,qvU_.#-xYVʛ)­2QOUrT=I.t8y^;>_gϢ{FFHv,O^ƃboH[ĝvXۢK09B%RwE``T1>Yk8S~D#j?? =' \磎V\ޱCn."j2>`Emѫ^[F7e5Dczo-I;Uʖ6@OvPVy(\{tC N2>+[EJHB$sGwh%YN,unTe`W&)rb$гw5c hL'xTAU}R3tޮRHP4j;k:l{}']p2,!hJڡ1ʔ@ŪUψ0& FD|.z? a &l&cܦ5e^f Lo$$}Lj$)v$G2BM }4qB"\FפT$dk8T9[F>~Y> =oj.9F%C|opba[{$rG,BlaPJ48vI^+\t\*2j]\??}(#fv- C\SDez̈́ɏg$ߺ09iNPPP Rt\;=?`A:G<|BqyOE]×_g"s|kA?9{h! %s[5.\k>2_{ {NR ɐCt .=x5SF^TZ )#S) sֽ1I e~T(FJrHWXG]zswr=Tgue몛a4ezz?|~S/Oxqޖ]嵝 y;&Abr' Zpls,#[z)"Bqϴj=UugAn@̧CZqO/$zk(#;`2T@)4+A[=΋6'؍E5#z/lW`)c)zXg\?Vu p/lm(v2v 뺝 -/Q7m ;=ǎ*CDlA{5ez_$Hky 0p7}b"ّ-5p:Ir$}m!6a!&O{xNѫ{s8D>RKlS:M*t>-ez?!OS$^o~.Mעw8eQZ(I7ҍ[s3SFVtud1߻Xw!\$h5 1|9 *=m~^@q[Ux,|vo3CSx ֚eȑ* hY93ug/롛fWQ `젚cȑ* h️ @CǹDmHj/ўC,:j$0=a* LSF_Y6E6"$Sz5_ K:QbbhF"I#Id P@@頙4vSFggBW:/Z94PޅmWYk8B͌/2+M z=YW0yڡAI&M"AI{%?2.K]S % /MWoOA!~󩾡I4>abMr?ɬh׽N;'!rJjm]u+xێv~3S)rJzR;9ew۔W8j=@Kq: KM3G-#Ѓ)YSSwM}s$Rid4P@Nf!7p=g4 >Z#Id P@@/UZ73 B]Ii+lȑ* hw#H|]][փQMBH z/-'/͐Y`?-_Uz쪕[~mS :u.#f/RS L8[r|R ĝ `yX%T%5!FV:d*#Ы'^&>gR|tQIqԄd n^S A9pT5BrSF*iZkϚ2j;>>?x R0sv4gw4zԛeFoZ㼏LV<.vT-i HZ(Ig »륮Y_z|(#[gی$'~zNg&z j\張\TMtnO-#\+EJrݖ)#^(M0ez}W23z\;szsl=>˔xS":4boRk#pٸ>|@=TMV7ff)>Df 2gWkC~먓TF}u_e[=j$<)2^v2<} OX^ fxX u+Us*uv uQoͪQlzU/O>Hâ^ڴ٥$9%BMj|-zUb?/c=?KtFpX)rb$SXҵW&}b1O21[i?22#2P,O8Y@ed Cd† )`XmX#AUz<:Uv0PSFWQatγO2^g'gMZaw𬱁A7acO ~6KHK|Fj&|ݴzSFnM0t"*-Tၯw ez,"]|ޕmh$c-$eYQp fcikɹx _[[k2=]SGguJv[(4[E0b9܉oVa[-#ޱIYI̦DW6gUp%*`*-3G֒i=K#YB-$ЛC?AKi K-[]Җś/_6^dTqZ#l.#1A{$11bM=A#PFVMU0pvO v\F1pF8V+1TmNya5ޔo@8\asSyEq`NU57@9BA"zwƗ/ܖHBC a(V:zB?c?JlJ]=RK1W܎M+P9 }|Or-5x c^`E-g^߸Htk?IbH ţ3zA#bM }XFVtϐqVl)lSMcfʐMnulƸ/~c$GD(HVm6!<ggv嘊*fNT$n(u㩈@Rv%鲣r+w`9zY`P(O)izDb_vV[F^}/y m߶ꍱ1,Xr7٘2tKhax: ezje?QT"v rIq2jr#˄CE!$-K.'+r|,#;5欉je%f3j-i#Fȱ9쩽+T֭TbIC,.yX͒HP 4 -=N$9akU)kff݂ktFXLaϣn$- t%ZfnAI5֣Pc=fGX>V Mﺣ\.CZy#ڍu{Ra)ޢs;]XFV̆\wX%02cH,Iгl7+Id P@@J1CJ?eb>VHj)t^Nċqo-/A&fPh^W9!LvN5ڣ=_:gg s-rS BC.0՟$sJ#YB-$3 +3pA@g1ZinH΢HQ0Qa]wS)9bI3sɐϐ2usȽhEvFzFR1F~$E H~n(m75_ z#p6"֞mLTVr}?fIsi!_@O̭FO-D/ߌZ5&_zr1 ϝ@Aۼsb:EfZ) >y#]kO!5FZI{҃~cR\Kg%Oezjm%*yzR`O0`SmWUo "Szg`*ڳ3[aTDll8o̷I΂W{AHP 4 L<_~W}9/LSFVYK 훥%fZ̗w\W[|G +Rv;Y?زe;Wj?լG{wFR%T{M%rHiӊ?p 0 ?4 ET ^@@/85qPB|@wK4; S|CcCOwSK?m]F Yi"Y58+A5X` ~ ={aq@@ / ]b:B"(vʏb0X9HszKN7eb^s4鴗KcuG?goQ?1T$ENT?w%AE:HߵH-n/xRY&+P:hi.?xUj=y9 #"ڼ"G_Q Ȫ\K Xv ۃBTp{omFl /DRڻ \oIG-_Zsn/m<8 žÆEZZ[3A,`?[$0 q\[2j}%DYJZ9$qbSViZ32-#,",rOF{OMs画>[FVM&_("'u}76$ރSmÓvhYiI&JÉ,(\W`V?{~K(s3YJ5\̝c% (Kq>K'Z${[o]6k^ 'lX"C;#âcK6N8$moig´p, hb>%+1(q$β/ ŗ.ѫ"Gj/I7O?Y\[]]ߡWr>: !$drIB2E ÷EZ-Α''z=Z粦M?%9s6FnAP{/=yWXRHHɪY=7Ծ^}h| j:mH^0Q nzˢzNqɡK^9R%T{M(-Fp(y-]9N-Tϐ>MA~^2$WX"=&0YAi {PAlPZ@1x ٯ0@uOxN Cޤ.zлYO0g |.I3cu4Q/s6Ge1ʸ4.<_V\Y/򞵰Z:ԃh g9R%RyEjv/wB Y~y iڣlB 񜑔n)|Tr #mY8%BMhqvoz6z%bo9quxy#JF&v/|F{~J-)Y Rd`Ԍug@"YO]9R hx/?w%zqAt0;#Dd2F\* h虙qnfw&jsԣz>: 7X;u"Gj/IWSEF)U)3+B.H{I&, 87jmRHP4 z]{-;jBL"ԫf ]@@m:84yKMe~ޏ{Ϟ}msq ,v3_ʦ`zΒHzm@ET%LbCYλ'h2= p%Q Եإa`ԃsRMJٙ߈PA'OɝuI5q T%ɯ]5h,-kJllg#4I#YB-$3[TT͡KCR5.opkע;c@!xJ_׮b"J:?\-/[ ){lL*Ro\@^ƌQ3y ]&3f'ޒsRd4XqQw$A|%[Smm[Ԥ+QTLn"G@^B@z.q1s' 3z[2S~\_`|ϫB9%wͣn7F&f133fmO_K狚+^Cg{hxXO9'Fg(-UX5֌t(' (W.FUE@m%ɑ, h}nC6c1lSܤIlejw، 6sfKuX/@qkmQGjEdP7)\؇2/0 21z>neӯXs)z‹Dqn>Z5)F9AR_{Fo6J*jjS[8_ޫIC8W1>fw~ 矒JyiRg$9%BM= LET)=S+ETzR}mApTw6UPQ w~q=H i9R%T{M)B1o ۭ+l"g s3 wrlDRF|@#tAW_Ӟ6cH9 -)|KjWNV&_sHƵ lOs@L] Ll/%B%rُS4Y_e,+]t3`,G(W"Gt|!7wo]71'P{\z?udҟ0ɕ4|~6٬ﱛfylө| ~ʁr[ Ȫ }[8]RE٬ֹ1A [p.F笩|Ϳ/!ږZ-Uk)wKvR pWqޠTd*H>K#YB-$ 2G@c8.}ri35h!)#в_`cjnhLTw`+H,j5eLx'dv6bT-sl%\yg9 @\@{5j:&*ץ:}f\4*՞v@OoX̓&'F#oQSF[$jn1oţ];]\F]ܲ*Wt jMIyb c"d̩O`@Af0LϰM8Һ%sf=OrǘB( :9 @ux;~`\܉kٔBΑnq=HeƛqwPN`.X^12[/HH%.sĉbN<{P_ zGpS%ɑ, h`j(;"OXZe&'d&վ@/cz{IRnOw&Ҩ =6Zeuͫ%Qn`G)~&Z"9p֬Iy8Yv8V&fZgb:}}f⮷-$,M_`ϻ7}S(FX]w5U&]'H>]\"xfb]g* (#'6MU cЏIϾm)9y:'+1^#Id]}5~oJں*iq,Ps)⍫Js9HLjZ>7K#&HaoUЃ\VA"~lK V\QNOsjF xO2*{{qg&'il<YG& vi+NP<> Id P@@ޯFe\)#0s+m}%u`ܴoNql#H` T_@#ETvl(Y^k:gXU> ^"YhDSA5Z]ui_:H#&^`H\`5݌sִ6 F"Y5;mR >W޿Y@ p1H숊3=P ]"Z]k1g(~b,CZ Y*AЀ{ϕ 'vH&^RL]%FZ4`P)ۭ}hu[opܳ5U+ZnFRPFfI32?ԁ9VL3bT`@7-Fє.KU[ @ ԰wvM_Gf}~lû`(#3tq]*14@Ȁ-҂gzxo VOA[D3e4+9H-qSz[D=B3б`_ N&jugOp`JއIj`>ZӶLPx2]D?SMb|c(<&E$td (0ÙW4o.yi5? 忾#> >or9CݶһEZu]977=u|U ezς3¶;\@l=WՉ/V Ie6@ao0jӈ!؃h <̒;!SsR}7e259^&&8_62rۅM@O Zr{'+f0}bǔ ̯K@ Ֆu3~58虵\H,qD'y]-)&o9.qe[et,?+w_l3,O0|(Qj<R+"l9Ÿ;D:'wK*TLzS- l<@ %=˛OBxy劎=YeznxϚA-ʮ;yYVj&=5 ^Ur< w#} .R`WrX|BVs=Β~ 鳧G)־+OoM2~̮G=.6L۲sz(#3g:xHd+6I_OrHf%ɑ, hag7GsrΧ_z;{(#\T'%g=o]b7j~fW\Y4OmrVl䑩+ET ^@@x}X!jE@J\>Nw/HB$`O;vXz"o0ez}Cx5"?*zAb^Tu/ɤ%k,ӝ9inl<8tx%~9wk"-{7ߞM4 2c[ĠjHua@Z(I.L6^x6B~N稯NIW 㟗o#Idz Nq}Uiӥ_[mY&4ДTb{foN}{[DyV!&Z)#!(bta1`cZrj4K)#г'TNM%Md[zʙ[L e$ɑ, hY#smjdލ3ݨ8uիR@oS1K2/@2\pL߂d\@%C_<  @j/I?Ⱦ5ckw$N =W{g(#VwKQ}^37+oOuq5@EZzE<09r2GZP[DVFNY-3Ɩ!F]3gm#5ez]Y"4[D6-SpwyfxZ_Llb$9%@EjC%I2Ku{s@)WG8fBk||}P9 e6>g#σYM2}TlAq:1h`deJb D غи c44:{B\0w{9NK%K^k 7  ;ĔfN%0Yӌ5QPl!F3O7uP߲=%@O fNs5|S'D hgsRuȅ399f3|7##?Wxedm_Bd,1ʹzj~D\.]):]:.K= $./"+qQx]a@KRx}cR{W*Rw]P\)8*rzEړy;oClp!k,F鹱|[cf=-ss:~ H2iעa| kj,k.hZʬ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 #Ue3k:8W8U~ʪͯì0_K#SF,hۺ6t[h$n=ݑ[b{[Yr/nk]xT%M#2  /V@m>ꇥƻ%Y4ezIj?CeyvuhCf/Pq7j\Aĺ2wY𕀋c"?ߕ/T=1Ȋ$_wtUVcWNLjtߺbJx"*U$PV`Z=S%>/WBp rlȪBe4 -J5iSF뺥$ڡth p 6*4D\js2jfGvIo?D#.LKJ0֫pf"&z;EZ(m՛o$Kmw[ŢO"-;)TE&Esw^oY5ylcjҙY})ӜˈC;نeb7a EZ(ATU׍yjcК3Cez3ۀD8d+@&9X<@ #\^ {2zK"Jىy9u]x;`N q}m'?#F (H V)PtmÕ  gUGT ^@gX1= {mG{LkƫFtAY!BXEy)1(j Ywt$@C:d$RuM:vֺ!rr$( RQq7GPy1ũh[ D cClsh` ""u{V-0W cT湴^:rF0ea0eI.0{憚)ڃ8 EcA9 u66؞yӪrGH#UB$Ccw}^ײ D՗-#}X-%kJsOEv[QTxgArKj7%m[0:o ez;-af?we~mca2H9BM?OKeA$J|b -i={9Ȫ}uԅlJb -m*8A9Xa 7Z!_$OGEBO')P{񐙌޴ivpk؝fo;;RS xwvmIׄK8OZf$GZ(I.r6=NЬ5Bukc]ݱ LcW P*ep/};0eX}(4.2%!~25ρif|y wa>4ezb nٳ IgBnduxpq07Dr ^h/rr$ KE~YqZz ϝX;#3z|RHyl-^7}юezDZ. n3_aD[p臱[ڽ9׫fV-#ñ8zvi;oVI,EZv9;1۞2 >y$>nQA!@ #e6zoɬ>x "YyǸbR-3%-y6c t-t͂wf7--@O1$o&e( 1ԷmUG}8K.,A;fD.k8Q;bn1.|b_>J/9{K.SMoA6lB1.zx[|t❵fǢ>W`tYFТ)#Ы{r9z:)#kIptM}ezj9mL3VȪ c[{T > %1 }tv[b<|.':."u2=fUBp0h޵CfQ;qezNe䒈8_Ȧ^`=@ҜpɶZ)meve\JJZ1++FÚ}4VbhMk~RQl/#r^d.ÙlPwJ(] ט\ -ft@K,vek5rr X5}|crdr."Вvm>?E^*#PagC7Z1wl s^7`]M&lN s*{~iLxs(|Z^K$GD(HV|;,@-j׃u {0`4鬬 #R_b:R@ջf8lV'p%f1:sV%IBX(ø"- K2yhռW=R?poyķ]{:{(7? =v ̏i@}~7D&ݡW3Pzڳ\Xoo̧ҫYgLOfȪx P z8e$Kd՜;l=v`!f*8t݉߻{;!u/\{H#Y" P$f1dj{4 u"NHq3.͹ִ,!8rj̾ql{-]^Y8e*7xy1Ir$Kzu|3f3c-jѤtn˿= m$HPe"ѧcRjtѽt(((yeN2ϖyb GĔUOb>$5#:XDV7vV*p)_mH<o@[Wh+dE3ck켲~8{Rc K-"|-;{," F8o{'`AY&]3{H6Si) wD6j Kbjcx]C:9 nqQTn熳;#R~[@@i:$=k.yFcϖ1u)\&پJez]*ZF˱g[nJ2[_Ƹ[榗:ݻl=zj/+Idz:K璶~/śPel^HyjYXSOsERsO&ݽ{={C}jY vwM$KXJf0BH Ԫ&XJ\^[zKz ETz۰{{BU^ZB=rA<=I.qksOneԌ9U6IZAMrϦezim c )kVj&AA*0 ccp ez]jry1$lh2=ml+7J̈y>S6l-5Wt3Aڧ׈'0K#YB-$j>VΟ6KvzY?&ڣט%+shW+VnV"Y5f^v 4̓2Bvw2s9*f[y7湌@k3XoibSZCK;֩_S;@bR!GF Nm,'[ԧ4k}[FZ[ w˖~좣UxhFdXcP<%:7)`xez ?xz6jSF'RI1ƢAo{R2=H [;؄ڛ=_8{Db$ɑ, hMspVCu Z-2ns[ƭyX,iIh@k%d)ܿ0SMj^oo%9} 0 ڦpޫϛ"^ݫsTW^ēШvxFtFW+d4Mji}b^̊N"tT $%?4lpZ,I.mNkt+ {al;Sv&s)rJz֮p2Jڙw ezm6lXoYz-#RU׹:XBg sRI.1+ė/ɏa|0H#k&sylceYeM]>Rȑ* hMCsB;yǀsD s3ofkf !s fuy5$&3)=Z=ejz LM $}['ؤ N\/Mw42̯I7')ӣ!#AࡍxN)8[6Ůf~cH{8zk׮6$GBVhȑ* h?R@LuP,WVw80=b;@>_0Lc͒Ehib 秉dAM'x[1HH>pM2S@AH=?/s:䳊dаH"AJ@%F6.v8\LEZM\b|xwSΣq(v^`s5:v{udP:0[f9BX=Cq vpHSӡ-oy]nC@:/.Df l)XR8SY4V셠-n;ғ=I{L5 ۬o j;/PUmW&mclYUu/I=>)J#Y" P$f>O #=&iԗ@8uA}0W2]dYm~u|xbs/Z`|!VD+I:o<~2Y4MZȳ羋mTsy̗GO4RHHɪf4hn:0@ pjx~(N Xlg ǰMz3%TjsODl\{>|7].S YP@ӷ7iNh3D= CY.tfzaE[g)#Гa&r@W[X?jyCA/)?yɰ-Ipi_0#'ˀ$GZ(Igه=њR;]&0qD^~Wj8a $.uӆ*|ib-7-}8\E >A@(Q3q}(ě2zz:r4>OUW|8+-ڔ빐Xg.`Ts6ZhB<ܓ>Ec$GD(HV;y k[3$GZ(IM/Rq b$ #47A+ˎ<$h+h^WeyԖU,&vϧ}]-ܖaloMl)|CLH7i>>Yz.&z`U!10#Ѯ;T/OTD_\>rupЭ`*>uI(pk# z/"x?2W$K@%&1sY5`˞s<xmo;|iI2^ sezWq_? v._ޟ5_j_~礷@Osſ\yzi,lf䛚g'R388֭e90?V(c}t_^X(,]u B޸- ezQāwg٭,-77P( uW_Yk2Yk]=Pƌ2>U2k2jֺ<}zW^4,p8`p4z);s7Z-rC4H}EV~ Kڕ՗+ow~SFW) ˥KN9F?A∥&Wh$ז%B:M&jg ~2#Id P@@O͕.jx ](Gj&ڟ~,%*Pq弿~,Ph.! H}vOP/hCVt7--h59a ?J.=ԁ鯃Ij&ljcg0 SDgw\}S'2̮ӟ;@ f7dV'ZCKo6| Hˍ .2^d _aDR-619>i(zYl)[9zly2Bb.#}<&Ѿ1GSTT/Gվ^_ {dmOB4%Mk&@, hmerVFŞ!ΏcxɅg39~ċxŏǔ}:'A(n>jRL<(dr ezR)l !gz~R:oy>-]S4Hٵy=ch Kb AÝ/#)=JF=W05]SzZV߰>/ ezzl& }o^xdrm4] ɗK2܍$9%@EjCɟ,VB'.x6H=kKj Ky(#3D+89s˷w8x=nji;þeeLyI_d㪾Nvy-ٽ (轀]G.n?N!m$@8 vnճedށ2 ڙ25ͤJ8o#=zdEZh¬vbѷ^dcUfѫNS߶N pU`*0ez ׵"> u)6̭ǰ t[G=AQ@^e }wu/}>2=3ӑe"c˜ߵC_GŴ 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 ѬѰ\NǸϷ_6k½C^xfs|j9R%T{Mz(12;C!]S~|;'*x i]ߟ(4iH5Hz-@E7Lf  zIb:CC73PDMNgGSx/F%:(Em {N"Gcglsgijqʌym:QMµrN+Id P@@OHi_->( )_j8z:97=RHHɪٷ*}8wUFH#&^pYpUmɻSjwTVuu\}<SF?{=[`Ed̙UfK*n7ꍍEZmu7#61P9:9Ciu,xk$ɑ, h H,ui,=+[فxkz ETzFuRҒ%c@^ RC&V'NƷ:Rƅ~S6ѯjC7%NC\,H` T_@le~2c16o(#Ы7 Y@Ҧkrwn[9 _"84ЮFj&5%`8mkWjQs(4k~?1Wyo}rVgL}됉j$CL \@@+8fR?fYw_Qd0ςJbȑ* hK?cF5$q|@7.oKˍL -gōi+: @stρ?o &C~a3NгjYHO@5PVZ?wmփc>W?Y3Hkk ^7k@n>K::=+ ꁗ?{as=PolI_6˟l5 z.'/:1z2ϊt>YdKF+ҹ򤾗'Ϊ 2{v[Ir$Kg_eueA-X_;؆E%_x@R$1vݕ=' '3 pTԗxYW rnݶ̿ @Mcg /Tݓ3ӄiew|ÓIzN?^^ %sS n ^>PLm[zzM#92)# wtB3X*-Zc_kπ cek1~wM ltT# FQOŴ%/g׼&.Ǥ9.[s*# _BLg+P#x5^"T[5E#vU3hmY]5JÞC7l0'C8"rߍ30Øރ]{sﷶ?{mPYP9{f[2A10N tFۅ[| ;PZ\׽} w+a6'\l9BryKx:|/a]5撌z lŦdmJMi몪IٖvƋ"ʟޱ;|[$h ]j YYkN-##>P̧#a?}k `1XgOO7>"$6؏p#a6џ|^2f>02o6 Xg;okHh>[Y;:%Q4Y9h胮 '~²_c#ug UFQXR lwLA]"ԏ_C!:`3J lkQcH +;C>{,c޲2\,߁e>e4K>nP>ϳQ՘"TCgx+JvUyQ;W8~mSi4$0G$Ċ`@>UkX5Xc=g#'=Ghחw "'7eȱʡ3 prM|b>"$,Nv@bp(z`w[o(HС'IYG=ITNC4]HԡuH\8}3~{O+Lw̼(U_8ٵo|5P6o:{7'm{2OY؏tpΎ 9csb9Uy_a$p ɽ1k;P#s7æ}K)j~еW &\C Oֺx2IYI3¤{Ϝp, i=5>ro̽ Q YhQM\o%bG??_HBecA2ZMd:qUg׍Z|G=e__m~{0"젽}vh"I\a@\ 9ze躉DZ\P޸IoRef\_HmM|ִge ʻ׃q46m!!砰.ܶUD,smDxzLtqN], VXP8ڷ$jUNnMִi5"4՝-&F(Bl[aVeX:o"*V{Un.[7L;s̞1^zeE9V3 pӇp'l5_ҕOIW'Ɩi`]J.AZ]%C;dGݰ7DvNj\ir*;u.{kpN2+siNX=Y`BrQķl-#MdBof[,+-ĹYB/.$ͽ׻zޕBڻ}L hM=:uAewWw*~틸fܥ,+Lx C 9 @0;|yz\)ZNqiX#B#Z/O^ܤbSŵ/XjϞG>Qxrvt^8_:5HHv"*jπ$K/7?@ v¯ H^I^QU@=6kDh#Ug#XzFg(հ񫎐LXG\/AZcCOȀ$A^L|,~6 #782stn9}q]/^-{?:x(Q2@[ȑy':QTvQepӬXn9e8󿖺<|'lFŐYd;$J%#=a',ip"EJ\8ԧK|LN;y'ۂe83`^?`[; [\kdIe=!75O, G3-g:X?%$b˝sy.myjő( q.َ],0ڃa%W}P qJړo=O,L.#w`yEe6?p׎1q/g\HCꎹ!OXjπ$͝dKeu~Quc-_jQ@C*|yg[F>tYyz3$e;aaܾj74SF>=6۪SGh`^L^lwgN572^ҩ=#2yYPFF|Uvs^,*CJeZ(TD=dqG^U:]>P2x9J/->rP\zt(?g"EazAe/`l+:{_/茾2h{oUgW_|BFtGvB-l>+d;!4lwq6EHnEfVdX8)G ^{n 3Bsc( ]H/X!8s0%5,r(i*6a(PsmJ/j[qG@q 'CU65YYk2 _medajtՂד* L͠Ck9L~] }D}pz Ygai-ɱ̡'d@Fnua6C }/+'\.L3c+Gl-izT?P `Eܗ#0v2LErZZƊXg ̡e]N2msYj|@b]Z(Y5XqAgHUG:KE99Vgsg]mk=hR6v<#(13gCr s 8yKܯր֙gMpO- ֿˤ)#'<剚Odew:SN9ܿ{c,"@/[@yԅ-Z}Ke I0iV_ ,K].wFGgvw ޻Wel-fܫs,{.GDyz@E$"O)'TwX eU".ƚ2r|\HQ~ѡRs䔬ߨ3P{5}9VR% ScY\"p.A?oG9VϽ.@}ɷo:NMǔ5%]kW1@1VXPw%)KOhWi\#]|ALC%a2D@]M.;e~KGnIڛuaIn}Ѷh[ GrQ/1r!-K`D8206j|pje6eV8WB kӔi+|Z9]Xۥe2\M\Ʊm)#.pŖ+w 1%qv'd6dz,yN^Am5]Ng0t& }an-ɱ̡'d@* uո(7}*P>(aHo˟r;nc~_I={m:vG.^d"kTSF28^|S\fȔo&e#Nu rȂčyo])z]^^jwMse\}JXjٟCއZX5_r2 rQخC \2}1Z4nyag]Y25z2o7vULrjs˭JnꙜÑ擻NXcɩ> 5m^ɸ` -hH]PnRq먘mlrlp,~eS|}Q8WK'Q0+ܻU[FV)V Sb9ߘ|㭯>qL:w&62n!`ZcCOȀ$'?Hl!7H^wsZgs縣{g2gA^%/-dbg}䠕J䘢"\T n 5XYn H?cYz8HvD2QB+ >-9q)Ms%qݚ4NX)i]ZcCg@p'"Jm-7GW${KQ՝-fw`u8V>_*mӗ0FH0;;4|hz dƺ6**ڳ' gٚ|^}6j+|nP߶6!L2/MD-t6$4̡-|Wk]I3"lV9T{$GǏ`Q=;3 @yfGzѺ:2C__5 d/jn%riOȂ~lΜ\d/(W>kA[)#&k<3Ii͡׭8򏭺$pnCeda9?˿L6G>Sɲt찇ׇv~wso`< ~q|Ů[[LC gqC0O kR>kq%Q#9n sl.cp?;.ciõ: kv'lp.rn//3IS=j򇋝(28{`kW2Gh RAV)ަSs:bk1"4ʡI69.9Tv+JP:[R۬[N)#9U嶛>Kh\}-VoRJ)cnj!a՟-֍f2EKnk`_"*Ty Yv⡟n8gP_:MH mc`Cb ބڀS;X%Ƽת]2|ۥOy{lp.elѠ[S_dLdKnϹ70C>;TEvS;;-s.#ծ_9vR~G\SS nipliou,/kZ5:[Fu}j; [Yօd{t(#YvոRV8>_lYbI>D_j,ɱ̑dXLI _'Ku"$Ii9ُN& {v!! [Gա5x_ 9d0Տ^^{*)7m۵v8 O?Iw+ o`ߏ*wfu1J*fN$WQ6mO ,tz# 3&לsւɁn\.=pixk~^an0}O~Q [=A@֒2 pvzP\Hj8(*P8ȕ .TAd ܥl8>5᳷A$a os# 9#+e,KH)oX5¹^EJ<1we\/aTiԨy bEeԟ0C%͛Ss04'mu#nA Ve,u'{h!b=nf#rr 8j֫xCQ @r)H"& :ؠ ȿ"_t-وZ[22(( {2#*)zȪ ))-^C$$2IVGAk; ԝ=}Ez`:ovU6!/5ՔL?:p|3 m-pfkf֖>p T0yl'㄃/'*¯\7 27 p6e}9kCS$G]oH-*ZcCg@PV@4J[]u J(GGJL[|F{p&}krJ9V9T{$.+ՖŤ|Oqݵe# 9& 0| Kgǥ^qu?^־dZ(pNEdꤽMދGf L cHaԟH&ץ.L- "C)#uԃ_gp {͹jkw2hpiccwZN+NToߑ+ 'Oӂ2\km?:=c_%.qe9N58_>3ߝq-^`01H?K,suyo`+Ep"̰Jlo0L9f&ݫN2?.Fڤؗn\SnE>+Dg$_ϰgU.T^l׶́*zUo%99 H6|VBXG7Gר/#yYB!6b؜%9'd@uYݸAs(#S~NV*ܵe>5nCuG⛄SHV]@GJx KBr)lrLhd6,-tx˪op.vKijEM}0oXA_v[WEkEU՞IuY ̗*lyq{@楿,>rv2kEU H,e2"8P GC!R{T2 q_PcbASܯyWGY>a+S*+xGLE#rr @XpPq4!vj#+j;]Q{3q<"$+>_.kA\5Jh4`w9v4F3y" ^*v7XDE5pT^W9eFcpjRbcR21zRo_ag*epy9e&W v)"@Վ^#/:"ܑ[v=SD`3sxр;-$j(tuW9-I-egBR-B0D[CB?[ lCxhB`ep 'uɰe\2e8ǹػU'%- p8Oz!aM-V &Q%Fw7(MdȈH qwȸ4:q^,cIe=!gm^69:t 7bTHHc}[):EfWu̙ˊ.|H#y(kIe=!gWs}o`) |?gW{UCI9z'Zx9 Lֹ cUgEw%-+:|N-JL}7ʹɈ;6o9K8řSJewy[Y֖/ y\%/ m-}]|8HĀӐD$եQ21Ϙ2ˎ$ tfmY}W&GeL0p@YwD!ʩ\"oȔd B t2Pz[bҊ~.u<Be=!7/)[px<7[!V|ž'~D'8SZ֬$g''QKjJ8$m~XM8_gp09DC+-yڳ- \R%99 H4DIK,ӥ w]A'(K׭vsg/ ~%˟gK9[,۹3!f,ɱ̡'d@;B9#EKi$_ ƒ\zE?0ؾJmʔAq^ `f71o3 icIe< ,\iWHFj.5Bp킽W59Vq/IIJ& PFЖ6TRM=ѱ )0hlcٖIXc_kπ c|3!GOFu1+it_Vk+L¡H{Q$=z v/V:!צ5qfI.3ߔMw€42\aΔuR1EdAҭR@S_:,,tot[t#ĎཾĢ//e3|q εg"T7e:fn ~ ;ArY5 !pل2I>3&b@tpP!fU H?c\}.C^Lƹwej3޷U՞?ۇXw(7F >:Ԑcw1 =k=̉u{UЖc&$"ra"pH,2x!99R ̼Ƚ|V"RDZ־u+!1MW:7YcCg@k"]82\J| 4?g?E(R6RkWa n9j쥍fTCBX `T]ja^}U٦>E>hf)ȤuS)(RTq{0 Ȗ-m2/LU`3JAxHPs燸Ec3) q;?y ƣNc!}/c" "q "Ŧ?$r:QpqvUWF޷L,RFy,e;ڏ4 fi3%99 HN C|!搗5#Yꏯ#S aT!OE ͎rHY~ gnjnhwSx{Slpڙ$ ;[3-`d=z~y 7k \Rvյ'ov* y .GF<OtE aLXKr,s 8iIE~g 辒v2}ܯO=ϷlrG/$1l[ģۥe+&Kr,sn %H_Elo3pU";G~h?iq #f(#ɹkUudj51"c'-):dm$le4 p^*9ϩmgpf6]w_.^x HL"QUFEȯb"|k=ങsqn +dcŐFZڍmC e8+PzVahpxӪF;q,8OO3gF xڲ\6yy8z/ wFZ{']xO&ȩjk gv&U8H`ҿ9<38u4"TψzvƄ=@ɻZRէR5LçGEY^';ΐU,%k.BX6ct^h6WuW{V3/aJ:#%.R{|w8%pux*G{{{I]Cb Q{kM%S7ըR|֊=7/p,}9/]'Aee83q{ }*e,Z6>5e%99 H6QwUcp$;JS׽W9Ѳsh18/aOq֒zB$N1W2 ZsRZ>5]Fᨊƈ(GGrit<ٔc M'V4VXHda8 H͑jp9hם)" jxeYʟ69YK*&|l&>/ϡZc#$ &IVnoiꐴe82~*!_G(D n(017ZK[Fֿ0,x_}D싻z\F fB^;϶+0uA|UBnܼ;n^1" Yk,ˢ|ö6ı׬Ōz&QWB`PҸ+NzΰڢJ8#n?ڈ{a5:vvV|`gσ:mm (xN+r;\ӦCُYi[o-C :pex2ڔծFmZWթ}4X>EO$4$r20 o=^zeHCTإ*?tGH%[p!4Z'/gOR/1s&[Ip·yP `yQtyZp(Ŧn+" ުe\k_!n8ӼIHSxzU\<ד1*xVsNb[}Yo9{SF&Fu^Y!x㶞!۵'Ǒt [F{iL侬do%3cHa @?u]ò.Q6=F^0.XzXlC`C5g#@ҏ#B1,!qN ˆ279M1} p<_D{fջN)T>;Ǧ)#Za \OOHu3z2\QӍ iBX#7 9YM5 o OMnS4zܡ!3~!3Snq4{)"@YEtq5jǖ舉x͑.c PFn*4'>%CSDԛswYks kh";{97J4e{y(# wء4Vn$(sől&iK?X-=`HȢ-9ү\*E"un5jP `vs;JRzrް ]D̗$}Y_[RzP[Y+rr H\3D)EDoHɀP˙_Sy&^ 52RB\ J qUn5[$)#Y?olu. eeLcY=qAe-ɱ̑dͭۅ=z? J";P{s-Cy ysd7G2o@ijd vZvZ3IUҝqFƊ=W|VYkم*h}~cCh8[Y6mxb2Y,$T2j0"),\#z|\HQ1x;ښN#MQm}⊑eavYv#ucPFS QS[20}^%qikIe=!g(w. ~{Ρm5_)Vߒ-Z5QW9"1YjQ|4Wc固LK4g5^q,:Xc#$ UTHVk:yEӍ34On_i9#rx )"@U?ޓaxK;edaq ,La d+*cosa;w#9'J"%?qIV6gz3i$=U60^g` efh%uf '~?{<*8@G)XQѲ5նge}y5LMyedP^u9jM\"W4nVVW{Ȗԏy&"PzuJ|Idp.TuyOlJ\r3LwV90G#0#UN> Oge:*ky"fi<φ9T@}4)5]Leɽk^,e֊=gޣ>z%dgKU)G*K-<:xa|+L3 _ *PV(Tj;_@7%JK/:U՞IX$Ѻ]cl^1k~pΜbg#@iuyskV.e,]Aȯr'?NjtqB!8/SȈC2_d |Zt|d@CVo#|eÏf`EsVg:9]S.EkkSXy.՝1"(G$Fm3wM(VQ\$ϷM?(:~++}++w?('覀~qi{$djBV/]a VXPaY̢2˴/> Yq= `]|v[b/{Ӻh"նZ$ZWβv.*g65AwYlz!^徔1(%dϴ1Nx%D~G!BlJͷgp#vqLuN'H[]ӟ_Kp/?5EvsTcLv t<ސЫR8j.w7tY992> %t| 7š=y֒zB$nZ\ri[{.-8 7Z~)~[\G%P5 BE1c#w zxhi~vn=suM9rt;R Z yJL?iyNxJL,䗜K-ZcCg@ޗ!Y>,% g[-0VXP8{=ͻse 7%({#bK7eY9V9T{$}~tIѥJD>M{9V9T{$n"@J{Y6x/-.:)GqD}Op7{f[}_j.Z5ǥ :7/oeJ.xS_(A|.?iȡ7X2 pscK/zT隆ESwkN_M릴ՈWˡ8XcqC2 }"qOl>UǾSaJ#d mO"-l6qdy;؏TuhUI݊cwEcEU ǓiODƜf'9%퍷 4`+`$@ޥQ%Z2lbNNNiheiV=eem{|[Fy[GHִW{I$'ʲZ_F9ȱʯ5g@`IzJ Pv>˂Oϳm-f;BH#X1o>+[]l:l q⪃̖+:&s qĐS,9L'LCpJ8Kt NFfpŠ*P&"\u~rB]WD:Z& ƻW&Gχ8SU<6pb;tX$}<$^ɧ*+$2Ir.2, pWqKa. !a,\=%gh][έ"*jπ$5WĽfSɷUDk#BPȢdc@b!#L%;ĵ$J}l/q:{ڄPr q#$DnDF'?J{Ӂ3 pm!)vKO>BsA`Cg@ W<Φ/.& T󝿽۹kDhCug $R qŹ3ݴ̩ȱʡ3 pLƋ?5*V;~juzłJa唿^P^nH ¥XUHn<g ظR?4W0ն)%L*S[MY.$ Cccz{2cqAg 9IoJg) Bg}!\ڣϖ_;: vP>\/CLPFϱF)),^uġkm9R PC$1ӈ.hp:V~+Jl]9ܯ%=yM٦/",;G ֒zB$njkbOkK=)-]"6s]v\ IO>nm0zKr,s 8ؤؚI;p2ҵ/ F0Yj$bgKc e>͌)#wseH,:L$æ]2\8V͒&HθmD}G^&8b{3,C}Ǵ卾K61$(7zev(ΰpx UHr7'yH~_l4¨)u~LJ.x"di|wCd9lct'aܜ}m_x'm.sO٤OlЂv7x'D3{RJ*;\[Vm6؋=;{eVME۹6Lp[kMZ`p2Pqy7j /[|ľέ!RZuG_8Gۓ%KMX$%jٷ2%99 G412Bb&{4BU%~:Lc_2G˂,0T;G5!R8UL"]&q/ :FN&1E2z:z͋83m\vw2:c'}ҿ0p,Nn ?2'y{?}gCO0ԫ߯GhDro@!r\&[H>g;k ʏ{R,C>$2IL_Ջ]UA|qR5egA6׿!Lo8ԃܤ}wh)ڊ;iQf{!~4T?ZQGMR:g W/I+# $uVo)#y&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{K0QUz$W9V'Zx823yNjsN]>!ty8k=rJ `誹; {/:Ϝ'Zg.#\OC&D6l.,clQ`~1CRGV*rj2ڷ:9DY{㌝Pv+b>‘eO]`m\+vܝe\PK#`[b_g)ޚ-_'eOƢlD_HH'(ϵ}rxr\=N4e83m# A(ICMj{EX(KsݚrM]UYfJCZcCg@g̴Uϱ4`iĭX > f{Kuy\O&/mDVW7c#uggyk:o, -Pfavt9YY4T#бVL'5ʎ;t uI'&uOt$kEU՞I{fUIjw̒R O1|Y]G6|ѯHq ˵ŸJOƂu16$U.Ja(i{M3hWWMN , 9$2\TKVkz8 |@XQ͆?_@!K1}CIѣu-_kK)omu[kPr9s5~Kd3sNaaN=ez.#}y'7 =q缏F9~b9'wY#[cN$>R[H>pK` [F5x됈`٤J a|'ykz!m BбfI*7Q&6,̰nTe.-b3[?[20]ZES>r&8e6o"d^e5X$ Hq}ndK\Ws-WGRW/XcCg@=N=.mΑuR2=ysuVk uW),9vn&=ɛ#yEMQ 1 t:ߙD,n/>0{5\FskEؑD]i߰1PF+ydH%mG)P{k])vH 1̑3 `vCż`/wpՔYvX5c™yʨ9 _!^0=H3)f!Ũ={Y]uޗ;[RU+T_=TWr.}*7zjj6"4ʡlg患$'99ڣc`ͱlH`#8J:P}GUv9X+x/ δ|5r5 F.H K/2͏6jab,Z#w2CT^n V -”,lm+9kzI(=/5*Iz%_Cݡ(Zܸ2R,Gߘ\@9F5 Ĩ\'e|>LˢO<֧92\d٬:WGC 8wHC }/7L>'o^ڐ>$`cEZZZyW ZIXY]Rg37eۙۉvcq̓Z/ŲclZk(#U7ɝVx>)ϢgKe8Pُ[ng ʾVv/[zz'ۘSNQ\ksd}XX ] D(ldPp NطDb),e82}]; _j>~`45WӰhHƻ]ե&Kr,}9ȑߕvq-(QxQ8jV3BW5}֔&7eU7U ͡ޜ%99 @y]V'kuh++VFy ,7e83~OVf>rJɐӣƟƐ͛)~pymo͉{j-SD2mSj;}ͻS4"ceaor]Xc#$ F|a4\0 RdO]z+rbg@ ϻjRLNH삭Qtl~zNC׹ p'g9LN&xZ!]'eil/K;Jn3콴P= %ߜv`S{eZ`)Mפ5gd!ɑg'qlYWᣫOedaVt5% tg)# v35dV*yİpl1 YKr,s w^IQRb6InۇAP `vXYEQ[ըo^X.J"۔:MWNpfEbq5:͘RH$xѝi,ɱ%;2 ɕ|-F +B6s_J2rga ye&f 0 | [n!eߖWAom7jp755O4:|,;#H[:C'Do^fFAϪ&(:H`Cg@qMOz:*.3mx\,򌕡 *oˡߖ~$K5*=;B<[YI٭!f,r\ej&ܙɩڇ ; J{>~*pI>7˓lu:2\ٯa޾K:W(r]´\{;}p87!XcCOȀ$xoRۺ]U 12Y/kM̪-0GB~i?[K_9OSN̏^78[~D~K`4$4 U-,t也ײ$5Td F:Y(΀s#q4'G$.g8%OIO|5XcCg@ _א5INMOghHdˢȋQ.bbI&/Mp9͊*V-,$2!m4.[MykeziJ@dȱʡ3 pկToGe.`Du *=rsU!;{"*jπ$̓ xf9f5%֛+K+߁?Oh}J`Ie >/-RwTS2WYIb*Y:?+rr H\}VG.?U 4ѕҊuBZ69D$N\^źh x7qk6%Exown)]\}׈{wEXelݜ`us1ZD\Iz-4sX A{v";}ծVEd?\ 5E>kxw!_T/K}cT7?6C|cÿTtnMvJL'Ѣ >C.y@zpbrNW~~mJGYU.WdJf2\ڠG/LJY돳6iGe j88Mi;Ni F ^θnu_jḛF-H7- SFgb8Bev9B 2! ks镳ICtFSF-ܼ]8Rj˻~zx(##s'u۪>ݾY'ϓ@01}]4e'Dc x9q% (: "1B8䔮oF#ݔ9"Аa~7џ uZ空'H諞Ocq2ˇ9ˬ3w80Zz Wh }fi]Cq:N7~0" tSJؿ_e絮sDGQ[2BR5E OYR(q, |2%\HɔxыȿL4L22"2*,m6(!W>q~Oyw MȒOnSVXP8wYUaXdX*4@P";,Ɓ]d3n)]65#+anECkFagAOy s/ǻ#by2 mLr*3,7!3]6[Yt4֒zB$e`rWBXܕ0P:s/ӄG)ߕ?VSGp󨽪˧ϒш:,j#O:/j4Y2Y rwpRu1U? 28l,8O!%흲S/.R6VuُȂ;w3SL w~$@&>l"8ۭy4~&t nYٽm5nK(V%F+wf~1("5zmir֧/ۥ|N?cEU՞IVeKUI6J׏r:c;y+|dرOHݢ_\8 Ɗ=gޣ-nח(*sSXc ҏz5pY iVuOKJ!:`#ug~tuKx]ﶴ[2#4ui3̼z]bܑ)ne/=+2\bWIl|*U ZcCg@=1j0)KrYvCG:ǿ|Nŭ8kEU՞I3jp?c\'GnzT9,svoUVX*$ 9˙}Q:# ۷5r=Qvcކ *T<@wBbqu kȱ򈈰 Hh0eԙ'-ثܛvR^vϸj1{60 }Gݻɶ8{{]rԗ/ezl~豃~ka[ֈ(H=7eqfU?x*inJMQ>rnP4j+rr H\7eڴ.h/!>QܛUYI\HlZcIct7cK콓a)U{(TLֻqX+rr @qNX`,Љ cץDe~p&0SqE8P乱O;+ %[5PBcrP׭ߌ/2nF \9vH=6ڪѾ6?C5js[ZUkyif%yQw=41f:jڼ njAC^ϔ ן=ć-΢̞.SfMIi]ZSlC{Z2+ILxb ҕ=y7_~<(V'TSUI.fZꊱefy2RWNe:lNP=DQv0~:WBk.#ՖLB1M;i=۪7kgNcl/ >2 pfB&]zCY3J7=t϶,QH˴RDy ﴴx+Ir[O>}_9·0zyZمu*/\FS+?3,!tHkpGYo*YoS.p#waQjU<5g?kHhCg $Y/؇?~D6"OJZrFU\st1ThLY.!"Ys-:<~pubjEaeC!mz=H9R hx[i{hMRVr0sj:)Ǐ*koIuIO%KEoێ8T0rΦb gfG 7t*_GYXX;J'$]pZcgA᠗4u̫Pmq9tC<)r=kKWFV:VרkG@]9#\ٔE6Ϻ!9>(pԕIp1ovX`oR?tL[[Fku}+T$ZH%C)땱+xepz2+\%4qe8y4MIֳuXW MYV푵vms\ؕѦk!qa~^u򙝰ˏ C_5-zV 䦌;d Qޮ|̑8JRd4G{-G}k^Ote83m,αu1r%b\ $J]Ԟ-54MZlWZK ٴ׆ps)Uܤ էgJ" Lj䘭% x-&$m)Aiۅ(Y5o%v4"(G$٣Q :-/=JhS~fF`b5"4ʑőE>=IU˪]4X1JEĬY-Jޣw:`=ܶ8<7sijJF9V9Ry Y/ǑF"SrĴBXOi3Sƈ;V^";?69ô98ցzo@ߍ?ɻ5JW|{p7"4ʡBCf.*>z`@;R20 GH9 2mֈ,5刚s?]#jQcӠꨣTebʩ]]ٔL3w9Y(fj2Qy <ysZ>ЩNIh̪?5"(Hͅ.U֊=X]juKwJzp`EU Hx<טp$q\S*(Uٓ>ںUXQsaR+fŶ~{b3;XB]e-V,E8Z?$س,*eP V|!aT-,jh]_7\pԻ٧$ rS|ZT^>rڮ5Pi !.S=/$\ܟ.D*[AS[Hco6vdQK#7=[ZɌ%9'd@.Fq~[&_wѸ./HG#/W(PѹwVaI^Լ[̪5/dz٥NFh(tr;5,4RmqiQN@Xc? _Ge|韒 z$ZhS|HQ~ǟ n(e!BgkQXم"TM6'H`ĥjӾ:ZTͥɹ;^_HQ=,s q/ZW:ARUe\y?ͽ ~U?!!QZh.Xpǔ$SS'm_ew/˽4DvaHu 䭵̡'d@MsPs X/!ޞA)NUMht$QƱ-|xkcve88dޖšֳ*jr leVm%99 H@xC|9IEqems(-ޝx'rC!C3v]e!kצ ֱ[:Kr,cOȀ$ ݂y^nt,Zq;V'4e%**5H,TkLC@7uI׻|C]W=c4~-VgzNme8kiM>^=' rdΝC{~F<|v:;.ѐ>,j\,o0~; %DEn+Dj-ˆ%=\J b|RQtKa{`]k7̛M aԹjݼ'K%YHK5!K^ԟpvKrWFމYTօ<:ֲޗx[F{xSG'Zb R\?竈!ʹ)Pm6YsFC3RG3j`,{pZu֚27&t"VKQtu'vݧur8j|g@c?j5Zyp.eP⁒tKҔt,pvcDQԝH njRY̅9nT!dT֩Q՝-f>ז)ɡ7 %{-DQ6̮mc  eٿJ >mkӾkQqg9\ΏeE1N,d֊=gI_x J~nA5[r*&\%܁kFz9~UG9ϳ20K%}Qɏ}(h:d< F=mI8ovZڪ{12ZiV2!:;Q\|U=Wg:JkIe=!g&ǞRs)z{:i*A\4˗z'[+rr H\OF zn>v\&a^(NN.+˷e]bI1b1uX',% E<2 E(j.)L$IQ?ߔ^v<k\;rW@4B -9`/X!)Á+>T=NeRn_,i*q)"@sN?<\$.GwJc%"KW2e8}X?o 1g5!Ugg?ݮ6އd7YD?䨗]kβGt9>ZcCOȀ$F$Ӆ^davUa>0nU$CATKv7wU8P @אe|@zlx|R$P!1r&=BH.mH%7zU;;FM깳vvys [CYPڂݐs5 oK0e8û\ 1u<],m,$er)u/gr;X?rSw?Rprn_0s$u{J%#wȢZGi lCsx&'Sq(r⩑<6S!pmʌV+nھ= ٕ犌mՏ.pDEl:jg x,ɱ̡'d@ʗc48!jK4M.ݶ71w:]9F9PuYOsvsme݊krBr4A[y*=7. `DG{n \ Usȏ8!\}U0^~O]`gaJ6s pLM$eu- E"PvV%%yNەCߨVD q%ixjCI;S72\_|Ykqk\:O}hF%뇺]+7yx81sT9j¬ !W@) S`kyɲ!-2LuȮmMGI=`9Sȱʡ3 pP_OEe,P5Wc;@DM`wמ,=!|d|Y9V9T{$.0i;yj2wSreP+rr HܰviP(DG 3D(ig6O}-H эD,H]rQN*zQ%F⧘1HR wr-#%` 1|9ǭ5X%?O 4;aY#x洯GI+E\+rr HMB UQ'iV)#Y&R )#ُ_!zUk $}5Zҋ|1 :";‘ejqCNX2apFE3H%ܝ c1J]*gVXrep fyTI> 0!Hfc[=QHNpr B q荙+ݘgR8%4[ K1j`!]*z&^WFSC`n$ݿ yFf wziE!0Es E][Ըs]b\1!*w$c߄dR.#kp]@o3墒{2\ѐ}[B)2I ZјuK޵|WFpsK< 0D儖'd@Fc9@^=hֵ<۟H.KӪh.YsvYϷrDH^w!*\q[Wג.צ,ZrθOK웳m%g," *# HȾ ͚PU'5tR:Xt?WV$ϟuv1zk0;Qw/T=qo%G+#ko BΝ[jbcQվĮ̾czFQ.o.+#=X}+PFĆzѦn ºSpm/VydsJr #~ݻ5CZWF-#N[. )ZP3K{P/2w$|'MJOl)uxoS᱆9R}8q5凉Zl{iѮi2c5^բVӫOJX wc˷0"ӕ]Lxx<1fj cl(4^$(|r3zs]KFVʔ3y$2IH^c.v>;l'C=IsFZWrcwAunT9Lj(H wVlkXYI' ZqSdܑ2׶.}>?DOu.@.3' L %qܘZ'M?8Z#L ܤ>7*F&{9|>2y ZYlWN|AOP z {F[Du.CToRUfDt0vq|Nn.e+#Lxr$A׉NKd5.a*tvAH o;xFKr,s 8fgp@&%s{x8|4Ji Qkލem= sy9J8DRI5HPBI( ؜P7;9n5RZrE~^PWq`:3/Xgt VidGWe8zlkIe=!W6"`TNu^qE}hֈ(Vw@ذp)11WNz8%hŔYSc7eՔ8e7N]i9q`*tH sᗔDn9p-W:.3[xs+N%H|ai IFwX-lh%*J̟#' %Vfa t Z_}dN&>4ا&,oD aԓUa{:/Xڣ½4; /4y!㖮ܣw̽4P^;'7H}ao4'G`׈̼MvGƠ ~F󴩪 R#{G̐.v!pJeLm+E[F0xO<&DZΒzB$i/g,RėrG6&{渿aԑ6|?ڸ^z$]Re7o'߲R+,LiyjDzqpqg%9 0Afi;D&#=Hi]ZPQ蹬UT2}u7-ч`g o,"@'|4ѨQ͢vѶ|lMN/ rñ>*Ohc椢aši>Sj-= B HZCBX `C"[yIub38O+w?`ƋmΛ:g\+!}<kĒz 5_bmN͖5hU6MZE={CҨ4ȤgT~wfm89BYyyCE2\{b*Y:b TR7 u+lWF#H~u[U\EONߍTf%g6,17-#懟mSQh\:Y~=7V~j.,HƮHc9YBdFi!kIÌ`$jw n[GI )8v( ҘYLE>Ys,}~Nͩ߯nؕ྽乏}HSTC,%B̬o.e< , ~tT='?qvmݻqZ.%'~ckH)# 2kZf<yHL H&& iv4;4{Pye2qͫDaOxd' o#zo6wwXD%99 H\y T%YSYqΜ>Q7<{#l܂#)IB8XԚu-x>21ve\jiw/VuN2\>r?j|A_i*!m]y$;ec9ӯB )eIw$edJRk3+tЮ,i|ӈ3+z &XĄQyO\}i\0YKr,s 8_F8k cGjwÿ .ngۘ.Υ}V2\=,4 ˕aevl1/#_ {彺pt;e4]v^t8Je:TR!SFk"+ZRF2;x Q\Zek.gHvQfYJpe_gWFk ~с9CH,lغŤz ho/?v^fc/.pr+wSF8CD/n㼦|(ea [5'ZF-ҏe0箳SS[Ș2\[b~^JZm3k> ^ Ȯ9Zn> e_͸@IiN`Ns!ՓLRԁڳ'~ V1ZF0DkJ89~J [Zw79RK U: +ѱԫ,}$2 Hit0RIt#w$A#kg=$zX)[›VLؕ,Rȃ'&ԱrKI>)^xڥzeZcCOȀ$ߐ~StEG!z -LV[buFIL)vЂK;9rṮCw{:׳y̙4H_D]ΝJwPJvlvd}>XkIe qwce![6s\|20'4jdr{HgaD #r*Ɓy.x{Z$]Pœt ɧLK䈁e0It- _7c_ΖjdRsdՖ2_%̦Ե=h1$WpU7֔GzG~-v==漈5 ?mBDŽ_Or" 7yW] Os>EǨtGժ)##OKAC.ȣMS;a}c\)+2090 2'cn͜w/h5h|߿eQ Dɿ!2X)07;#c9N+%tƒ*9agr4š병2`A22πQ @.rBOR2\sN,]vp0I8]?uw1?}5$4̑őE M#MrXcũR2w%S(DyA -s Z'trհ s#`;x|]i/'LeW™ ˗9zb>( dqje Y8Fe(6P* G^ d:W)^vϘUeQi 7)ΖuXx.+GFx7𨋾W_F<,MEIEi+c13[mXN$qOB7t:Kr,s qs93^RD7'i쪎+!2:B}**Zg:Wȱˁ3P0QfG*OXqcĨT{zO&?ScXƞIO KhI׳mYˠj3d(:=ʮ4D!x%}/9yL!ƥ.HrZ/akЖĞo͔pXђzB$N]Ӫ~ G)`ߍ}۽dW 6d&Q9_w-{-eyfZZ+rbg@ufƙ%_ޙ9r-IZm1"(Tw l a~L$8Kr*Jbehp}4eI u 6W" w ;ջʜפI|b]WmjyP'V!i~0O6*kp ܘJ~' =6jԓ-# >f}.➝Lr/rԟ -ƨm-:`$2Iv~jJP1j:=8*`#50B9^mV7[5t5xmz')="CGD8wPWtQ$^. Dlpi {؝1".(W ceCPF!6*}Vu!\X^<)w\/5הZ]Rom\ 7e8]yuhTK )#w"e ⺽/k)"@7/] 2v,MQq)n+=+#W`,Lt!&xP}k ^] 7s1.Fg߻7==ygEdHNzx`)Dj2w KzZ/R{tk(NSWro0PO e<참Hg\mm[3cyr/V✗וjX5-_nRŌ[MO.*5u4 .hyC Z*{tB똞XF^ lL` ,Q6?BQe Ozvs~s⎸Bߙ)a 5Pu_e0c//0ZcCg@'΃7Í$^?(ugJ5`nYض ~~ j*"T;*;zcI/ ` }LS3Y6i0DZ_ Y#u,# VE*lp@<4KR,_cVceIE6O%mXbR[NJrtokIe=!.~bֳrzUy*ƋO4ݳwKTTˢQ[G orȂΌAe/հaqd.ғp5 X0$Ă"^EmPkwOU#M,uWlvGI})+`+!x%V%2^CYY/uΫ-vy"yldm|#.Lv ~T'5uKۘv9mdV5 *)7!-|U}r +ٶKhCOȀ$= ۢw9GMco!f}ODj^@ҍzQ)i, 0FzeHdkYJv=cʬ7Ͻ~,ә->("qnךgl?FrKht_ђzB$nh#!Ҋyb4V%Cѐ9de/aqRv) S(}dWF+f)Q}^]Bo]<JaԟHkV][jqp|3n*QH`V3 p]Qg\!#ϒvh/%qɃ/BRN[u;oy1w᫛K*}cDQԝHSU.>J.^t-O|^~dgBI 04NuGV':ҋq/?o\"qtrXz-6P|ן=j?Dooʎ0/*̰-# O9jt QX\KpHMax0bw\W†Ug^:QVw K[YYE(;$hz-GcBf7]TMXO=y^-u){7[. }< 'A*{G(C֊<,UF%EvJ [/5ъXa:!FWRmf+'K2XF;CY:mб?ݒ]M}Pg{xOm=8$7yiSt7DR- k[u׃!ʿ=N$Y>pyNKOpTW gGr^+4WAoo~s?d#0׍ZœH9eiEi/=`/$z `9Y ccW|np!bHnwwgmp])%99 H_#qCh3~(P{3ui(@H2zAgvip~}]Ác]V(-eIen;FukaY®J9Jީ(lFZ|Y˥D.9j`&EαĹqxBfx6 0}=wɛxD:l`fV5HYch7iK'Z'@wF-*J K]NΚ[XXeB`I'Z̔~D0[+P 3\nujsڜ{­,H)c$ qGIG00 ՟s=-r"@``2%<, bd#: 0GGe[p i-b#:S6}ș220V@[ч0*=*gu -#cVKXt{laY<09ƹu^Pke=!Wyww/FbhhƤߠ*,ˬRUF9F9Rw lW Ƅ]Nϧ-e{Qj7* ᶑwKΜ>$\|Ho\>$Z ZcgAշXon{(|lD#>HU՞Iw{ڻ1_ڎ:>G pȽؕ>+Ӭ>[NWWDɖ]O+Q[G>+%@P D߃EPi-髗Qepr_D[$u%8z0EdAeY9G|km+;ZjڐIw:q nұ>SY^vmiH?.g;E&I#OX`{SdZVX10;w^Ob>17ݍ;.ZFU专̵eֹ9}2f=-2=$kvM v'$oaFTUyNE&XaBZ]T-K"[hv&\'Sd_zI N4)\iRHs,YVGfձʦk,\&].khDQԝHӗ)kz&(_5! D*NK:"ɥ%Nf'E(eE4յdw˥HY"U(~YW>)/?;/]1$0G$9mS6&,L[F{=wC =;\=2z'u9a206vk@u(H3/qo7{βO5XeR"$8YUv`ȩ5v.zpG4=Sƿ`EU՞I~Ue頽t랒vDKPLX)~cxLcqulU2MYF*YE!ߠnvW"}>񁭙9};8g8ʦ`h+՗fpm;Yb2Cߕfʵߵ֭\2mu %[{_1S{a%E>IP"%RaѸ:1Ũ\6o+(4 A1hSLrj8gϞ#=9Ґ4Z*M9ݖ*H!N E5 o%PZFO\tJ|NqS99V9T{$nb䭇C$+?CNCجhޜZlŠ_R, ^-~5nP897ӥ#})?, S/*ibp3y')I]%˙%$Ls0OUzYjceSFki2Zzaw Օ-[2p%F.!'qG.]6-󓀘ogZ6h)#tcmp)8-F#AB~#09C!"&C[jq:qfpqaRno[Jt[FV+~eR{`WDoȢZK!oXߦFS>knD,籈,i7O^[FVwwgLy;~M½W>z}I+/+BL)dm{ \ \_H=/#70x巔͚-s%mNn;yxшN}\7yI'a'zNʂw+# Sw1ŕt4Xst׺ء?= /q@׳cڄȂ ަ^&ST k53sM1ʑ3 `>DVyY4ohm#d*Y[7B2, }2\ނIYwDA9h:s2IQdIѬT7L*"ʕ3 ɗEtI`%r`EjF>#۷Mpb>xWr-J?@R,s 8lESU]YLT.a٧taƏnpzmU2fUɲ!Q??X{TI,-K'A;ܕ_ynkT5_y"Mjs: m 7]A '`İV w,O|8DØGLb٢Ψk%B ^4Ej,n# x鶖k# _ˋ>/k12NEu32Z~? DaOM|Hewe e -Vhſcbug $a^𺴻ZbpjuRݽkZSWBF*rck:^u1`^/%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$]5K1e81hנrn&{f?z9ѐЕF'FGҪ ~t>Zc=g,]g2XvYwVDh9<\1"(G$++͊㪖B-Am[ٙ5՛GhXB%kqfKq}\4KĦ0aRY,CM'xTgFBۯ|#`uug'H&F¾;r~=p/W`B3Vb\1N/>5!A7GGPV ~W-Sw$VV Ž%0y|>ֈ(Vw@z6f("9YR!1Po,@J d&;/ 1sךB"2OFaȱr1 1,xk]ĵ!dkop(r2\k$y~b^eojjS LSO*=/ج2Lh |e qM%j[|ΨcpLqe6]5q5]AUeG=q\qR9f\Ubŷ`H+.>%.OM_f.=6i_q.[M&%ntޕc#gƶ`[+A].SF+!,~U4*6qvUJ+7 ΐ0jFszzEڭ6%ܡWNGfWU]uX~zE Mp.8C y~j6Z;G4De S}M劖 U"KNO3?Kr,s 8}~7ug*;H΂G#?HL~ bkV&Cb+ o1Bztxٝ4 c]jvb,ֿ״H#i4YCP],684V-DіC"Ovff8v%ޖम_w֤%#%|+-##.᷺q{WWWFkx/[ mʦWsC Գsk[]lZlg}Zӱ.%mB5ε2.Inc~8 *4Ɛ0H3/rsj7qDŽؤ"u; (LG7Z_r\K:%$B 'IcG' q^0 3ccQ;X+rr H :¬KT#sZ2S%t'D):Mw"=*p7A%M5e2ĄpP{H.XcCg@S 1@92~I qGr٘ ՟6xI$\+i^ Da#rŚΎ6LC>:6s$S* *Ga10VXPrҗCFJ:T|C V䲇Eju V"^"QlGf]x$5 T/M583CG:N"sÛ}or#ZP/NLfRڀ$Dk_zr+kEU H\xgdOiV4R1>M1J]w+Ip|$=*kEU՞I33 -KK[NY_Ey\VCE=׬VS[&u*̸g^kEU HܰvoIʺlٕeܓ)=U+llN7Η|Je.E}7,HlXm8>Vm)ބLTd=LZl_tˬbz]V,$wzK?ƘȾvG5Ik 7s ^b2X,PοL"d t0Kdq"J6, pY(lDߨ3eomeZ,yM3 eg[AK p_cHhCg $9-=|UO]OeoP$B ^Ća'F|l˸xH/j2{LP>&BSJF |ChE~--tJMg08MqY/znxlHLA,OV=tնEeT 2r0)r~f\k ρxp#FW3([kyu!L MΟ!e(.)25Ow+ !ic9-!'dGJFIUƊ<, :x\;=:6vVk:ouD7Dr"t~{7P `[M0OQgϋׇԛ99hFk' J}FCr s @us  =sr`#ugD*,ƨ IDc@`$];2{]ꢝi1s\% 3e*{JV嫲r]Y+"@A-1iO 7~>́aR\cG3iG]7]'8yӽ{tA4s9"Cbٶk#]<ޔ첗{۲ .*SFJ&)'?Qc2f6E)"@>驐yʣ))H#54NF:A=tÆnN Oz$1ŷ;&$2Iu~!]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/u206%x'vXPRӨ-1 g32L6 grlq*}ݻ0+GcWNBpZ7֊=7Θ'ULd <k1e8= 1Gc}׆!0.E+4NvOrGƎve4#0ˑF/kӁTbfYQG7cδՓ,|;Dtsc CWlrְ+lSZK/ T8kNӅu o䎟 ֪xR6ʦݠLE+/)ֈ(Vw@X)#e;R}⴪i9V3\L7EW6)z/F<zhWFk%km?8dC(Ge8}"~aK>\G  ;+ #9pRq}+OB4S/$2I{$Q| 9mN DrB\ ?v\Y]R0k99\+LC=7!vS\ZOK(SFz1E $uxX|~ڳr?MiGyvytwkڕZA^f)&:Q1.%"M@-EǍ8~ I_;TOWb(Mi..6yL }ܙo]?E(hHݑR⭰e8 qmrq.> pvݢ'Du.׽%ϬQF1\ gFT-N֊<,lx Ù WclޮKiC*!REGXcCg@FכCpH6>9Nl@GmhrϛXĘY?M?av:%KIgc4? )^U bDWTwv^ e~x)Jr6m%=!=;bf^FhȑPNqbao)44q38U9[";.7x]{qGvkY5.uׯ+D^M!/f;P>IB>{w!l,ɱ̑dكъ/r5Ec+[[q cj)Ɗ=7 {?_Xށم%ިe8- CB;>lOB^c \#=Շ$2IMxʋj45J,vop'>&hm.&]:B 6u1n)re>e^qeRZeugGܹ\,-I,!So3!)j,#w~?Evvocp mC#m47pR+V# "g1V!DNQ9iD`FuYt|xHz gռ M: [&Utw]._t|G3F.),EtI ,_- Qa!!d&Unp`S 69 !ï5*1LtܹɨWEn˿ !k$8TA)sny3)Kr,s E-#>2TKf8HڣJIZ>\>nipP"h#-?l7z7k˸.S^A^&G1+r\AJ=_œ f^fY ߵY #nH%~I:ڣӡ?0N['H?NL,x \׽@brƶ,eԯi椿:LNÞ|9 Vbv2)>1 Al*Jfi#_gE 3i 34r\j "*jπ$ѱ::1͖eP@:oC 6¼B$vyThוYF3Kqo$l˳le\m_u,iƒy@ YX`𰼗yCLipO¡?kEU՞Il(fߓ}9cI<˨'c=@z#nuT'Krõ:*z^3w^k1"(G$YOP:}t/Z+T5vۉiGng=3TO5/P@Y)2zBdfȋ氙qv+72\kLDSE`SS[nツXˊtIp[%1pmy,]s r6Sfy+s6YwY9G Yc QF'U)a%-XE/i-ҿ6XR=:}Z>C,/2iey)ܙRqSFkܩlIwe׆\,ULy.(KYnzhc7fC!eP:SK֥e59&WyO˗#]EZH*έNBWH׽:+rbg@]\϶6Oa3],Jw!?QȊuG5Zj~T+v;ղ$2IkA]CJrPWԞIvsTP%g+cђc-#2TziiHr.2.8u+&;7r'9x-Mw֦#n酮ZnmnI}2Au者$1o&-|KK\6c#gsSƙ܆ǨM9j?z:06AYcCOȀ$[Ju;&.;idيH/\"*jπ$ `s/$=l.h=t-(^_57XF{YO 2XKM,L7D V2YxQ >eqO;|15`2wI8Օ}ab8Ɏe_C a5Gri?k Ha6%dgCO2Ne5҆+))i<;V鮊љ 24 S1G$#j/ Δ8Le8ĕWle>kAlwA]VH(v\=!an{÷T]?_«  ߯/TgSF3d4+^TyIu[t Tyk4$2Im32J_3Xaߚjywc:#1o9bR+!+Tq[+rr H}cwda4JzޞL *ɀe~=W8 D }BzgYv2#)ջ!E+7ʵȏpv_KR"=ál8ڸ~䤂2kC?J׬.͚)mWҬD{Drh,W6O 9˲mpk^R48M8 5;K >eobOWt)9}Oe=!rfieT s^ڳ!x}IQd&f|6?b]BܑSbR-ɱ̡'d@r ]dؕvoK LvD1fIdt%u/pOeAO)#ض8_H#B.:.ڻ,_Z{ >m&.\v v Ytj/XcCg@मE(ZTRl쐥e[X{gY9.WQlqdQ&|` ΄V97Di wJlɍqvBYc3 պ{c䆇@OxLQS~ܥ?n 'd@L$3m~Oq|Gy50rx:鱁Z{aLWvN7' n:!8O §M 5I{,"@ސ鎥t$(;#YSjj_UWP?ox;D;GбougIv3\%ܷYVJRZpɗo>C9{/]\F0J&R,c—֊=ꒌ|wo3aJVZc=g6n@=D8jd؞}2^R0k|=u]sneȪre{E3eMtnȚPyB _ «-I{yVevb<݈q'hJ^Mz̻\Z͊`ާZUvMd{"wjȱʑ3"|^vAtʼ8;Yt[#B;[ ̺uX)b✦tJyF4daboȱʑ3Px 9B٦g)"MZ*jπ$+#hʑ(yҁ*Rwy"vYOa]#$`Ba]y8SFذ˥wJn˥ږ!x+f <9w B.o#ˑڳQHZhy5k4"(RuY> ֙ qύeEߗc8wETy5 עY&;B<[Y}t|789`$Xi3XMo"ʣr3]*R^ Ks\}9̍ln2DF'd@|]S2DyV2@="({Ru;ZcCg@p/粔mπzh4Wf[J'ViG-Zj} ep(ލ@|]X[}KjUg_MnK \:u2ZSQr2ķZea {KI?[JUw*vIz׏-\h0˦gVCDj*H{.B5Tl yN+c &-G ;ƨ[sP7!B?N*b_08"u0Cpf40:݊(EOYub_N${s}(RK&I߃'Df0yOv|Kr|I{I^ev dzYۯKu(lX& 3Իlt87bRDg>7z~k#%S`Gm7I3][#Vep6@@5YQ+wx`*(v79i}Iѫ*Y1::}I]rŗ &VfQ2Nކemꥤ6vIaF?i`<譣[$벬a[4˓EyLg'"ߟKx7*-*81쬄?*VSy`ְcXQ"_ r.cjeplu,>5ncU"ci_XZin&Uϛ"4e]+[k}QEP[Avr}&~Z*ˀud_z]-)ʀR+XnUgR}.5G=O0NN^8õų5}9e7[I_&#L{sewˮ8HtxqO+qKV*VU{dpn+hPgH"uQ$YEjʆUr՞^#l˵(rTF5A%J=2Z]ېɢ,m發eC5uI.ͪ&%e4JeSLnW'}#S;LK]KTH b3X <gp"cvoإg )L+_2 P R1'r 3&OIFu# F\q51b:Vٰ՞WW8&LMڦ`%g* d=SEzqVU{d\48[,NZ"Ժ>?t0h;i`Zvval+ȫW8;* /qo[xʗc9J1;gC'Ip#JiuBou͆-~ZZzU4(b!MjoJQF#_I= ۻ|9[I8Kh"灅a\'@f؏r$z?`DnQ[mw6mVAU5Kj۟kH~W e=fnQGU^$WKAa\'@fY/$i>' DE}ep hFQ(@UڧxpSzi5[_V%\ofCcw>pRr*ʀFBFG?1UeF _~BCsOY\ko5`=_j+G+,h:ZyR4a+SLu <ϒCi=,>OܵSM-IdL1Mey1P״B _ $o!L"~H­}leY{*A5욙:ŧRYoց,= p2 85$]ZdiSs:䮲u2z]res$:ʫk\Q37 җ|c~_DlE0UfvțIR ftBeZ>/hx}c2ള.'[%v]N鴺r:a;,G Grz`95umR&BDpTYJLDyV4U6|'@f^9 TewM.Yc$ QU8Arڅ.,f׋]h5wf]WU6ar G*w!H&i\LvwxFPfaeAֵNg>Ey~u,k%㺅 N@'n>q~P?[9nGy|> XOb6h?i`ߣ.Kעnu>)ʀzzQx}e@=FX=JW])r[N׺ujdEAGե(zvY'8X37 a6  0""~+Lf-]ڂ}wz!dDͿD,΁҃-EB&Mg..@&2,n'oJωʑ9JR1r?XP01՘e ς = 6=rݗ׀qԲd>XG5moxEjٟS{2(o5'() JyUVoG#(Tr(@ͭK}1#YW N^?UN/9Kl!+ld|uBNq gR-FGkg%8+6 4Bɢ|(Y)*b--jۃY6w `@^xa/{DbGDbw窲 [x Ӈq8wݳer=!2N5CېGq)Yj27w]0^\t.vb#4 )>ؐlҶM@ GNaH^'|7dֱ|AýfH|wԿفjFS%Ȉc899T7>9Sw|=Zӡ 3L쿖%r ~u@4f0bP l]ey4x̧rĎ$;@6LC DS+x\g?8j7 4[nn>b6ycv GP21ш>E2 &Iۻhc([ kg|Pf^4rEY4(peN  ²=.4 \זykSZTPZU;~ ey°C@Bd-ʍyF x5a3.g^.2*[=ʢEo_,G_ى L ahE"@促jօB?|pޝ4J>*lX%W pdu7`zR1:說my1-n:6&hlX*OVgTS ɱ%?g޼v+SJis}IM$p&kP.5 6z2|Y^V.A lm =2N9Q?eʵUś>t>e'xhK~>>j^n/zd9 a?0,h_YnzAgZ2b ə|KQF#WNY6XCqM|{s@yWʸJ^o*y¨q:xlY W+UPUij6Dd-@|'!W 92 nE1,8Ufj]#۩a=2nb8ΘcAXS!}NZ\cpڜߝOWC;Ŕ??oFGvQQ ^KmoTYV(]R4D3<,ĖЈUYְi a#ߗ 0CD @KNl9ilX& 3CK<_4B _LhdRc!!dLM&rXiQQYf yt(S[x/mJsI9^=/޻16,yћGner=!%95v]Dw@CY;~pSՋF;W︹s~Q8T0.u"PF.SA]2d>qg+tZXhq8 !T@5Eu QxPjGv<das۠lQm! !t |ۍ!PSLoYaRgC{ڣZ;y,Zk"Kkg,qu%_>E ;NtRf:}vq z7],yW]Zzo FS3PepzPʼ xmk]:`^̞#ͲN,]3vCP+b!gظ.僮aڸ2I*Q\ b͆0.epz:!,DTw.D]q v|@ҖٰL'$@fMʙ"o|,83Rt=q*2\A;,ik\:D-쒧q6uCԪBQ)cd/9UbIQF0J3p|K#W/$ Gq91[9۱FcټsY\FN/r3Ƈ 8{F[ZWmuB#045PH3!D'2|U[2U⚲H֚Q,S8ya)nt2Sp7qUW}^'e{2^|3n ̓^|3x@a? 5W 2ȊNH$_x[WTep-v_ZP=Q 3?N lm|A@Ƀq}#8`1(ܼ1bp1nD|S3@7e kKbQg/2FDXiN0cN{N% 2'wQ&} n4砒0Xsm}ouax2E|;XCq=6P^ Jo Y2ʯgb}(ˀ^H;Ej(ˀ뿞HBm__, ܽCpW2C`Eat˫/E4x>a 6ApViJueY-ꨙҘ$7M5!J}lmdނD[SAUGp/i謳6qUќ"xIm}UYcP2_{*ue߻Q1.$Fz2)NDfr’IhsYA~vʄ{LdN]<2ि+*|toMn*K(J墠k+lX&G pYڨۉI8r ̱Kk~nθiйBS %ZI;fu2W V<1 e KO pYVh izXo.ˀt_JXzY&J1e@9Ct ߣ!ъzte6,w `y.9/{94 eUχՖ9μ<\U\''$7Իl׺$6 OD?oXv3Af qtEBc(YWY¸)Ə :!4%16 8Y%L;ރ4о0qohsuE'=Y'&b>\)dygxLepݪH'5}-L'$@þ^tJ;;M7Øu'rr ;p 09eYzM7vC]լl!L|=y4pK|꼙2լa([42l_Tw<5=EPzMk<6C=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(ˀ`?~fPLGŨ Cdd]E*_x] 񸯜 {l]F=i\Լi>JUm]cReْ擣SQWz" Ʋ fX_aƟ2O*j=O+uy'UY\ć}B8 K?*ez!&x4rz5pUන^{(CZQu `H ZabDçI Ia uU2l e@Ik !Z9yr7^ 6l K 퐦<)茢GX<֝>,uuxVޯ{ nTF>0Or4W#Ʒ!&N׏/x~PgV-~|d<\5Y;BT xȦqGNReP4]#ŕ# r%ί6GU yvn#JV}RTVn(Yk :O Aނfd`#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] !-~.[DQ PxbA*VU{deYzHlgyV@]wUY)O<]ɣߺ_]r9 x.u N ܛ'߬.e6, p>ͥX'hlsܷ7Yg.;/@)hg'ش1 ,p+ T?.%ֻ9U+}NQUls>?K ^T$/T[WDžA)1){#W]NXJ:rLb)!zɩ@jhuT*lXQ@j/ b3NvB>byB8_5eIIrXۥi<dhU/ ",gɰ5_2ҺtBܸ ()]RDݮglX%W pSKdYVeT Yiz=,ѨF,z}wR1-dxB 㹁G"5,ekP&yODԧ,zsW\+'^{ XBie6, pnV樄,cs2|t M*-s.ˀ>R}':9j5depa'VOi}SՍ ;C;%\(+/oaU]:Ȇa݇`c04=;cG|m a2[M)b\[Z\p|K7TՖٰL'$@faP&'MquCY\)eBzI~2 2-TC3_2l@KN@~ PoG[yՍz#g L/}Z9ɟԧ!pjKe?TC7]Eg먐L^!X̦S7V*6+&Kj;E12;;|vP(9ס2^C _cK>nzOvdCa8+a8[J8\_~]E+*5,du)HKC03L~ktiWYOWv4CV/^qL߹4uX.v"p$Y0]WTepD}j҆2j҉@V@.iLkñXVYC+Vup{epO3N*܌'5cep}u:zYOQSOzR[Փ]HL/mxɛ|K$oz."iQ) l<[6UKOiFUw VrZDK/"rVZgx խ))lX%W py:-w>fXz~ާ9-mk\gPe͓2|{9 \9yF=Q#x Po+ؼqHĸ )ħ Oiu쎧,kBR\`Ta=:͹.ˀہ,FІ;/4G 8gqHd!I~BJ4?Z.*ʀ/!EE.NsSN]h{Bd6從g?Ceo~령(J d%9U;r }K ,o1+,a\OH| |!Ht̕oq,cr%,sWV Ci-a\OH̀뾥cq[>Ѷ,50qiX6n3J#Ss6])Tr5G-ʗ^shry#Kyqzyѹ^VF/ -7o0 8l_"z ah?:`?*66墲3Wחx]p@e[H9tR"\c)wJe>\kDL'$@f=VAڍ3s]+[pQhlXjÒVquH:-,YW@_Ҧ>b X||+x]k+DZy]dihLoq]͙Xofn&scHzd =2n8cPKy.vxpX3βk",,N^昲m!!LQ,KJ1E ծ<֌,O^RȦ>]k/=pU4j$hvX'Œigu#9,ـT9=;g/-tU8ޟ7ձd@j}|CX?$WY,CY%=KZnl I ?4qnwE񺣤!^%0G5:nٱ<}:;>yї,kسխ~NikN=~Hɲ2YDg^˯a=epO Uã 2DZ 9R@s$6@Xf˦siկc߹ep*#6ePΚtۂHB Kj]4.8cdTYDe zBd[c 8։ g[p,k=jFt,cȆIꊨhd{ilyN[ K#!V85<_ov::Rp6klXjÒӫyяE,)VX-@+rZ3컦Z $@ٶSS{2$@mxZ(OcUw-kʮ ۉY͒G6WòwzD׸]Z;Ƨ'!1Jid[zU8Jhl6E*)<e@͕wO?}:Ejz2lYo--_ʁ*8ٕ`ԤlvF=)z&U}НZ~5fBk>i\(+mCS="v ,kmpRþgYe6, 6da|uˆyզ5F7Ɨn!qJi8C <lu\ '#dT̺,kX3n[mzj ݾđ ͒42o{ܹr|^D֊r渏QF`~(-CGejKB ?ۥӣm2$WI2~6Y:C\"pO(NܮV/W*{&9/sӯOy!Lj*VU{d6~-Sڞf!ms RP&%R^`)xJGfԥA aJ1A͌-m7n @mJCHߵI pg;XLߵ{ɛpaZV:R&B֟S{2e5n͕;QJ79ٿXS"hp責a/H$Tl磏?]_"n͗AE.ErfŪ1BسX`6h\' 5c#x] 6rS(2xlǏGMAӔ梬A뱞Jg=܌3J8 Kdn }Xiqe [H%)-JL1X|)1-qe?i۱*V#.;~\xp|as1|>C/>8 o }ٖq~)Zٕa7}uC]KVau;gSKvf0yO[1pd BHܖLU4X;=[?i~H cZ .CSF?ʖDS]_Ա.Gpp$ +5M[e*jÒáYz&{!004 8vK|s*rK/-D nK$ $ O>E@f"*@ [$֗[pO6%baI.dHՑ@1ֿLrwr ;>bksQcH+ Vf 9}u˻%Z`ǣ`@ &qq.b!K+*Qhe";FLN`ʟGHp.a8g^ew[{}Xve ;0L3-J֜M96COYְ>c8TYXNo6A7PbYLWrS?w}XE[9b8M!*>*VU{dz2[-NMi.c;j'L5hʆUr՞'V;>yb%wd%ZL -(`MATx'a's` Q.ZNHjFUw %5Q/_v nA` liugEƗFe[u÷&G4\Sa3#3w(昼4쌲6gFަykA-z7̆arT5j>'a^-m@V}R%OG}(n~O[e*jÒsͩCh23"<ѹ@aV v] K/>p؃/BߵB(1/ aX$gQlI8+;4S.u*ˀ׀]*uXۮFG.q"`($=l(cidx<]qRqtNbS5aU߄V}Θ8 ָ\7܈+AQɉpJㄮ-htI_gM|-WUU6 8(߰%<PZrP.ɼ)1sfxj7rN|rm!f~ܚ"b@@̫seƞs#D6 Zˤ(Z*-sS%D4(YGݥeU6 8G١|UwF gzqnr>_OJ/{ѺlϨK/Um <0k|UNwJj#zγK0*jÒqh\Y,FuyKtŃCg8B*lX%W pzw?UT SʝBv:c"&Z56rsG\3sQWZݫ\mZL&Y9PoavS/ QYdi+,s,#ChԯG!Iڲl"ynH[f27Ys8D;R~]])ʲu#}epb+?-4Nbğo)o=gQ `8'$aބSuFPM$CW[I=^u˖-U1^oR̆er=!2n> >q]aՇX\uM񀚞 (0e\q&xdL-5/qer=!2NEjw9E%oG"˒^414YXe*y*O]ˌ۱2?#O1gƢZ1ҞV$ E<\Ҹ'Wz B#K6gEOYLK8c ԦuSvfud%͕ LiiAՓ?Yf2'V]č]tnn oܑ{do=I;z&l ٹcϪ`jnF.yBҲ Jph.2dpz˂ntrr.F---~+V*DVY>&L_|:`|:?xqK䄀jV8DžϽDBt+TKBM5ŏer=!2N/mwX|s.w!p08E/B3lYF`ÑP:@~ɿK~hwgAזٰ=!2nv4TH6:aMʲi@2Op4 gJ epeDC_9N9-*u_w kaTG'g D6[g Pn5kr.Hr Y Uw`ï>k rЎEEtߘ*n]>MU6 nU>ilu(凮`Rb=?hlX*OV+ݨqHttG,` 3_LDLj=2[jUãKs] HdMU6|'@f@ST$ |30Y 18MΌ?SY{ h~g$l*Æ<5ds]O_ҾMQe71)rh7HAoZ}+B UY\P!UY\&gwU{qxg_Ao|8Ěk^# %oiL$[kvZ'A[f2OAjkeT%K,OK(\Äy2z]*eޚ]G~y _LOVV=۶v{6@kp 4+ o3kf\nӍDX6&PZw+{![Φg0e4Jf C[p_h)/MzQ"{x."[ScXt;N2 x ʌyQ7l_wm(kP=d3J~-m.{KLM/wlC=e U)ʀ^+.^~ɴи⥃חJ]cgvS{Ҹ ([݆#q`Sݶ>q(ˀ^)`vZZU^XQRYf2}Wgм\&;};t m(K1i1i؇3gҵ/SN5p)TL@ϋLگRe6!M sVZlwZ{(8?{'p`WepϠ buBXߧe¨ Fު[(Wepڭ5l 'vX$sUI ؗfʳ-C'|k?icx"WaI#Jw۱tt/]=kbye3n-fZxtovtvX]'VxyB Gwb ,[epe`7x^? UQP\lc>Z~jC̆IYOH&i9<7e`un%X:^7!98͋S$W82v7V \m +{& YH}DKq| 18p;juy?q ,jǣRxIQg-RVc9P*۷{|SLC9fx[iJ `5ԋQYf2ǣMQMUplO6==Y٩#u*Ӹ Sv8IUeyG?7Ę='CY a6w] imX`%j + B6jzj7TN7+s6 7xU5 4lu7Ӥ(/W'aepduS!)P (np5Se. [ī-Se{.VJ ̩7ܴE4 8Tc9OvFh_umsl zBd|a߾zo'ǯYW޻V"i?&YaD3`e*=Cc92Dz 8~"NoTe 0:`uY\r[dj 8 wR 2xV!7bd2^ObPTK~&VwDc:Sep:u n!3;n>5g,OMʾx]ycP 85iEmI}묽ԉE$Wx7+O٧ORbrP }\er@3HC$a]vDv:hf^^N{IF͒`d'3{T.# V>6嗣25=5aͳg]іٰL'$@f@p H &3)mQu5İu siSQ+7/zNl{}ƴd+wY3T\.:^9,kt4]W/a)U.{na֛2'$@fMLBYg*lXxqje/#vա$q'keǪ$Wr[*U9iT^9?yE{L^K6kTgum*Bo@Le m}XCظo>}ht%=O:~l<[sY\]u,+GN*gKx;{ (4˹_J88(oi/{B+E3[?% Zp 74O*jO&Cpw !X ڨoV .|r5za\'@fv2%؏C=| 8g!7<f5BLg}k`N1 *Dzyr au'Oսk^<̜?ךʱ>F&mnBm0 ύ!_2:.)(M]kG@o})+'Ku(Qr՝40lv QLІ/gS ?\ e &GVNo/}i[x` =2nVYgqWӑ 4]5L+5bսFsY{X͹G IZn^0K&WImG۠A ih0U21#U6a֫c]VO}u"KTjC tf8=%4N3֓TY\ofEPָbnvqÉdʆU9*fhG":H[(EqIW)&e|΁KsY\ TVf;lm,kHqա2x+N\%QC/9wUĭ Yæ1׉ k.UUY# ˣW ^ӤMK AF*ʲM'Jm9vޱ,kس~l~4 CY\{ F'8,7h*i.;e 'DE:A 4/9#K"THsxf s[ ~ǛdS8GP[쫴[/kk*)qjl ;0L}^ڵqlp޼<[Ye*jÒg$Z,.C wϨj7x>:[*ˀ'Qѻ֑4TYm M_ñi6ԝ zںNb>1%*"=yp3 \B9~m冞􀼅^[,Mݶ]9|R^Y's "{u,-Tg %9l"վE)'.[!(e3|[\BJX ia'vv_vt}oYGg/?03a6  q-r?'CK@ a -N/8?i6:xp!}n$+l%O `@^x Wy23i=%M+_wa`V.ǃҘk!q=k%owWq5 ?@_cj l 8~))s#;~#AwR Py݋;b*#X^Yp$k:2d5ø5#lwb/\QTw4(;}b!vhƪ̾&3srIn" u"p 9H|dVFy W2 8V> }:3cZXx7e9N1%|9_qlIJ:XCӤ?H Vݸq{TY:WH"3!?_¹}Uz  4ԣNK'nm31O`XI9aU7+:E={ĪQG:^9G$TW坤3SudL!tԬR~t(-Ա|}Z'HYOEAD_)R 39H8~;#$MnNT )b{s]y*{Ka\vvydm*M wĎ%zΤL8v]纽{v &ڢP 1*73^rUuêj/ tʺW0გbs9ŧ.oCv#$k5HeX/ubJu꺷uȯH黒[%/Y*d3l0*[Bda!,Bo0Oya ,'qOd7֞0/3"`zyc4v?(ʂ{p%_O07n&s0ðx/  fjz_) =~|Vo7=. yp.epjMFi ׵NeDeZU ܋^uA9Yf{UdtHd[9Y+l!n?:ط.Fs9KM:9IVf?ӷ/-*e-%))(WPVH;V Y O;E:4}MepM yF,~Gƾ36[zlOKse "`'X|Z)&!@ឡvr7j--LBmDb^: U &WAe] dE+m֤ rc{r C)/xqW& M޲@] (P-M~*m Nm iϋSu7'&͊:8W KG7dssHUV61r{95&͚=144Ur\IPCUwQ@0Alj{=$E A)ڥCWr elPP cB1o6d]MWWf7Xd&Ӂ~CFkЯX8Rk(:1X9nKSABZ>߿꛾$bml-g/e Ţ&dW@P6=`V=ޭ3j&*}:53v'pV p3@z(cfy^!^(p4jkKt%'CV?qYTQ   |ƭ~> Z&?u7"O6٨}Y 7tۏ S@x!wIȳ5`qo,{nTu׈EO4|@o3ĀW|J~K ʁn ذ,in}G@&s(eÜ4zi,t m|`W~ϗeĮrS3Q%p1YC..i OWi0+0p;җB[O OIꩽXԲ~S7UGsT1i^ i'ٯ]i-}g0daKuoSkϫV`XWE!A^9,!FLa*BWڀ訹"5nnQ @T1[hba]TK(ܨ+aĥw6~3Ddd1mX\ [ztH تWVJD,`{b; ̽%NSًD3nF3"PY=Dլ`l[ti҇3Iݯm)4md>麋>sxUZFK :eU=BB8ߒ 7@ qiƝߟHYp8mєhӸ@C}0Im؝@9rcgTuΚDR tRw8] h5SeVFH0Q|qajRD*9gFm|edm[')Zq0# GLuZaU\k:Y>VѹY4&g&1-cbɃ ;t7Y GtFa<UI+e*OĈcWdG;~DEep ''>@E}'9M߷8ը #7! ga/1_)0Ӑ@a}òP3Y id62HԜ˙(`/N))XJg#8138;sL0‰+ 7b|e՛qAG˰D7b2XA l{Į@¾sa=Q1qN K0, E!A^j{x>T[z;_qbcv$.A ıOؘlp 06vmW<Z)Df6CBepdvSv5E CWEA+aski"8vv.Zêj/ 'oHkgyoe-59$MxIm|m ;ZbVFN&o |iXװ,Hx ئ}.9vV`XWE!A'Ыt{82P8*(C 8ac>MO*l^z/ %ud (l1۔8ƾyƾ 692PDr`2SOۙ2PIA)sIaC{^@&(lw2X ˗{c{cvyJ<%Ǩ#^x]h&PԎe4N $,,'#al!e0Yک=-D=?VvlyQ;9b_$LO8{[:ת=qvz"[ukB"?."33⩿( (|O"y̍NT VLJuNRqoiEepc6^Leb1Z!5C "B#/{p=]؀q\$jY^w<E>ep#=zĦcUZYß[Iʊ7uP|.atՈfg Tl.K)qtNs:XVMoI i#G@XnKiYj˦z`O|Q_[W3~diF ۯU wje41.oh(y@Q@zq/;KoqYy%߹g&&LpM! Za{2P?oey h<'@_H;ƸYq74>-O[$3:5T 7>]E֬'Αw9q%'sLp8TKZ"( 1lijMc)V`XWE!AXeo3 ͟'T w?>PLuu$`z9:25ǘQ~~=MǠ ^!&g6.&WV@f0Gq6f #UH;8H!rR/3[II“h$EZW`:7 sQiRMH:RLT[9CIJލ0 ^w]OѵD}B>3/HY <1>;^[)kV7NShu32KHبNtD.#i]o."h}*SF)fDG1Gc5D1 DƝp=Naq_$l]4P\#ȉZrv.Q 7V̊FY nԅ,&<-ά~݇s5=l}}=2s˗nKR'λn7KW{QO-?ɞF{]Q ǟ2_NUصyw^IѸ9օ('zLZaY\O( 'e>RR(~(z>C_(++zƸ-@3e}}9#Ȃ_8"^0k!#Pbؖ7y3E+Ŗ >Ʉ5#@ឯE5b\#l:wJړWԓr)%r'ۘ#8n)*͜òxP$J/WX2 >%g*˫l̎-fC^9E9xܼ\z]1?cqr0èx.  oJ7אؚI垊@-їqFP/ Zc}x`XB‘xH(\}oq_Y'p7%tO<})t~4ipdU;)v\LEש nX-ih#ySd*pa"we`q{ӈ؄/`k(ܨk?dŝ? Ҥ:52]j"deOg&QO<΁})/9]rм'>9|LUOH?5Θhv0DN/@yӘ\]Ӵoje 8y)B|;E+] u(#d9c1rOwepê90P#k(3Ǵ5>';Ma@QʏdCb'2P8zXUZĪۻ){^ln54 ʹowMh hWE@NdkTuEj%Z<[MjѤ^OU2ibcJq29ږ7foHhZ;iHM:Ϲ=rqXp֠Ш؈VU{QHP8ǗPʦT:iLZc`C`Z/]%ݯ1/5׆f_dZ(q_+P)tyt:\z Y^"PS;>5z ,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"FdAvTCحyCO3|oN^0'>G\ST .;IS4ehh}7Ikz9/=ḉr&WOfĠ-|hTuω0S4+ pks4@ݔ9(w @>& aR-  D_'A^S$!g#aMݥ+0||KDE@׎s42P,h,h*3/ԜweOPu Z:Fhy{bUHX[-_I`ui1-*K-K>K+qu}eUC-mfLgFB¤n10̜sR6M1``UƣwxJ4ӁlU;Yrk ^Y޾w/+PUglJjP-op5 J=d"ih|r̄6* Q,fX̞%UQSC>q1yMD O(\G CCVs)cלL`O9ZrijnrةrWVI}r\ .)C潩jbV$e)\/rIsH E_׬Pd#Ykx6ǝC ~^G|P-e aZ~k0!%":HFHJ.Eo<;oN)`h@CiUoĀkOSTE(7]%N]~{U4I(u(E21|ǭѻ' xt\jO/Ac j>%XV  9*@[FR7_'U$".vxdȿ?)IK0, E!AO<wl F]McukNdc\;2w͝G2P8q-(|b[}lgc>n h`9A8YaY\O( 'bQcqfwN yy8QQនVCІS}89$7ON&=Eq  ⨽((\󦞁 ?sM׌w;] V /~ޑ_|bL`XBYﯱ%鞒;"|m^GN4ӫ6d E!AwrSFi 3?\ feeH0Y>Aj5; R+_ه#$$+Tfh⩺HHԺEYA(k̗(ksZfgacHµ"Zd۴7RZs΃ZS0RKAjȷn]#rgsIWT#dXa bdVӱ~I[.[?.~Qi tٵ nXXQ6^@ucQ[bZCX! &S卄b۽A$ѱee'>ai eq=($(EozcS(x-ѨtDW|@y*/0kc+_g1-(Ob&Ry˖Nyeڥ"ǕEqt0>QI+0pwy%ON0Xy.jPlP.`>B&ЩDH.)aZ?Ŗh'H _E?*w%b~]opįBo,H`] erS!fr ⩼( H]-hW<9x$ Ƹ$@x~;@|hAm'S E#Al+,y0R.4AFjG%1#GmMIᾶTZaY\O( :|^}5(l8VN|P}hXIݷ";)c5ðx/  &Zg'N݃vi-{^RFepQUk(ܿ8sqHS|ΑN=)@F֙ͽC߀' &-~~JlMpܑ}#J(akJ6]]Bn.Áҝ{5mX jX2%21S18"cQt}H)G F"`I=M+u%%ԊO_ #WEA,nk͙y y?cRhi⪽(U7^Lkߛ;fVMN" ,zaUq^n_t$i Bod(\Z&bHsAw [cz:IK0, E!A{>Iv2rWؿVܢ408Ÿ-#">=B hy5RᙐkqhX yGb;m~npSht ^c" ŞqCn?<ʱ;q J-KÆHK# . =IK0, E!AtCڇEcP߽SZā#@XUhߒxl3420uI;Oe"@?n^9¥$d(oD yd oHQ¡8 4ߒevS&~sT6.u޸(kh׿id:ЀQ6z~cC_ Qu؝@1rs 2b=vjFwDA3T 7抇FвZ/ρ#i~4?OR 7~\3b~~T6{*5F]Z_3wh x8$eO<_{4l}ȭ _`r6H_M}:7bͦhzdgHP]`-S4ݧ\ǞI{cɏw;^9 CІU@P01?K@7S;kH/e/44$KOrӞb*xjW[~氩 =q%R&zd,-VPV~DcFGUQ 7C2AA6!ptGVyX!ӌ?iB`y"3>?` ͔9'-=($(2ڱ)8=i@ចxdrI +&?.)+:GB2P81,Z{ fQ|&%d-!I{A! Pל ਼ ~ :P爍Z3/h_'vA*C22lh& ?%ۢ0JkHC8ib>_Q3F/柔΃iA(Ҹh⪻H (v^TUX~gQ &0T]$j9@+|=?3QHf{TYar{ʳ̇K]=usi=OfNJ""U(Se`JR͓}{ SrJ˜]Deq=($O]|!5~:e(ܼsOepd`l24Yo:M3sML|k(?ɯ͚٠o)'5MC׽Aao;j7N~{2sD;^j|t6Ű/M! Y~h>n3Q{eok,_|$F(ɲn9w)xvS(wɘHK&.ym3`M3D, E!AĚ sY}6+@gCB ʹ;>K(3Oܴ{6-@FG9s{b R~tK(\[4duH^h ĥxqZ):QyL aq_$M'94>?@z5iEgLuADiY@u?2hមދﰥ^,])0|L]nmZPBO݆r)65l2wOְWc6F]FBaة4mT_MӃnhJ:]G'3^hwіiY@qI){Qs*#oܣxBTeNv-e'FIOJv8q܎E~0$c wsL%@XaY/ +HmTP& M| $[ Ì55ODu0^>. aQ]-η4C+L)|,~M K1=#FQ $lt_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Ҧjy ϨIF$ 4+'.tD6J-pQ }ۗ ­Z+φ "`u(9GDeprX{SyBbUu qn[dF쐁;Zd4XPxjDmCހ5F Lg-WÿZbGY`φg d7sLaSS($ű+/lޭ8 7'J!T>=@‰um4[!8dtEm„dMLG zBQHP8Gs0RwȉC>*+7@:K9G)}\1~+]&׼jAi4ͿG3EPrXJIh>o b\RWEjDy$_4xAx2WLS(r7k6.L7[ޕ6|ٿ:E^q#JltiN\ߒêj/ >=Yq9:Fg.t"CtV0t4:Y,s7UEc`ݢx"rU^$l27}](g@Ƅ{|y:20]cO"k^Cv}?UV)Qb|03pjډI\vš!@c@X>|rLo8NZP$N@킏7+s*-,'[a.RQ7hz,ʟ7Z8.pHa>kO[@0태E0%6MSH?رg(NephEF@}W NιS͐M>|msHx^݁@>ヨႂ2qIPFmT1 ~ Xޘ{e(Rh.Б 3t6m kѸJ*|@xu*XSG<mWj {m{Rg7 IdGkQ1 j"Vf#V]tLIY=oeO:IdÊ`a@cIh1~n1 &"%n7 md @J31.&Fccbm_|[!,˭,P`ըk*u1t,K w?uMepdOhI-oȹE4&CEnNݤ)/ vrxөnRw qM j1eRT5!4'_B`7k n8?=Q֜%~7/ёg(Ͻ槴 K$bd;EN1L?= 9 vz@!Ђe PfpI8 1idM%nʝ _i)} ǚ}OҚ]!JkC' epaK/KDwg(*KJ@4 3S<B⸁#땼 xp7UnZ+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.&|<tҘL,V7AW⑭B=Ξ5ϰݫ @x0囆{Y%})sۀFܖG*(sthM U HOzn'x }^c!y)5j BV+%+G g B N:GEIE1MHM32#ӐòxP$1.qT!l~,<%󀢀 a>_32=OѬ88д1]M< $_)b 2I+Lǖ!?u-HyeHJ9 y@Q@mꇏx9q I`>zՆ:{2č"s?t/@JP*C)$0{hBaf%4Z@聢~=HaF"a%:r}c:ɯЗƺHܳP>;4t|x@eD n<+>o=J@ahh[n<-g8"\S73:\/S~A*,95*0޷ny'~Ws!_.rvIIuĄ[)Lb:IVZaY\O( 't057bz--x2;e3I3yR%p^T{p)=<*?a E!AkEC"1]peNY^zS`.wϘǀ:֢̾q{v(^FW|uc”4zZd߼ Vs}]fѢ O:xɜ}pϽ/~=՞Q99T0aV.  $l/ N5K fN~WAFȜ^BڍڭwZ7۬csK-͗&`}̤El)yb@ĉ׳z.#zճٿ.ؕ1%ȐR?U$\h^1i<,NrN82hˆ ⪽($(z>r tb8*w7 @¸U1_)WJ$$훬&u樂E 3b'IjGnEAV(v3]toN-u8SRk( 8$smm)Vkz%0ig?~𪱝i v~HvEߑ ${IU֏iY|20~.fsǿ0-҅>d`XP3N"r,qq@9ѝtwH+0pb7+ \* IQ;rٲɥV&/( /^yBfpW@±ij5H:ipz68f 4k=ffg>dyNyXeqk>z'DaCHOZG켪<'X@'~/6n)Y؋)㱷p_eUq^i@oӇ6GaL2H;F߱ wm;A@N$*ڋB­#{\+߾|;"(#iBov[9i eq=($(n`n%Uuk*>~x~=l*3t~{Q؋̻t|q:`N k=mW/uؓlbH|vwiY. gEx3kj9|]jڨ. GΚj]_[6s?au]7uNPòxP$LZ%'B0]Mep+#kV)_`&UVv?s'] )hi~V^$L8 nQUZO48 P%od%}o% X۰ E| Sm0v S ae%-@kD 9۟3v5w ⨺(HIIB^%/ T?[Xƞ15Fn36dWfOхW%]rc9`XBrO?HkO=KQ,6t{[%Q %WEb_I)@IOs;B }Eނ)YNZaY\O( ~KKoטܓ,o%^o/G cKbJ[vI+0pc9 30 ؝5!,ִw +_E!AsNw]ճR 9`0ɆmS<5 @!4l6`1DC !p L(iUq^1tu6=QP$j9r*#3S3\Lϙ&ڝWXM1OS 5&ozq8\Ӌ{oWԽqbo* f}Fa na0[7>}SBo}~#hiFr'[2tĬqHD1gö+kzEPb!X@W֌sgoqWvE Y #L#ɛRdXq-tQ㾎\:XO5+v+`p)4}:#G"UF&n'G5q~tƏɋEM`6(%30&Mbդ:&kϢ niJ }ak?^ ɀ٣({DjT|-]:4 `o[m#wtG=u-i؊;~НPoWx>&L`E?ђ} W˗ cľbVhnuD:.0AB̃'ε7t+\ ] S'bN>qk0eÕ:\ ټ&4b+a=ChCPC;Dă㖮!UcH!P`R,_O( BPw"߫YM,a8N``V`XWE!AV$Rw722ީɩ7)^/]`-s|hlE}sCO`XB- Q氆0]-r;b2P֌R#yseG+^kxzXcab+^cKCE9C#WYyy%Ҏ ^{hR?ݳBAq},! ͊,@T궥(YW x 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 ` ӵID(a(o{fOoh8?G(i`XB9>Cra[2P8ױŷYijP b&9Ȇ⭴,'S=aXTn+fMxbQ]`AeQ`LB*}q<dz WO '.Ϧ7$Ny(20_  se=mx>˩IQB|tw5ERei&h'(^dbUͣdڃu/SR7\ŀO)huGJT4x [87cS]ڭ^W_(n"`V=tSwAZXaY\O( '>G1_,v.kw;A/]vZqep㰽1ţۙV\fuP}TQu=lt2>+CpN.%Xb ]MǦmxJT`3}w^ч.F:{OzYGf^|po\{V&sF&[Hq(+EV`XWE!Ax9[\pszH&մG +_E!A3$X`-W1 `Ze>ep͊d(9 N[E(WEw1ҺCSV(r<185׍>́i^쭾OZ N[شhxKT8b∘iknxp4g! AWEAAjC]jWo"5ʡ}~;yDuUQ60 ip@'| I)3\>*BͶqKJУD6h575'c{U$j6e(7G\+[RSA* "vnQfh,rg+rYS1ے,62P(`z/cm,-qiGfqyH4-uO,u4:;)ws@ ]>Ec@d#=#]ZL 1b)?F~y.VՈ0'M~uѳS墻+OM--_"oOz=M:iBI5JdGaX<[[gwnƪ#W< n ʕv"v}c}f׬# |lED_ sʝD@TV~r'pctEQ;l7eUcwE3;3܎lD0=2P1mlL4rkH AA4(GA32P8b^Ω NcI[bqǀOC9#^GjGa eq=($(Zet\].}c"t=m=aQZa媼( Hf"_aC̓ ќْ~VڋBtzRUdƧFUS/^(Vu.^_l ?ښ;E J#[Q)&`24 eL@:J*k(;_K7uOR$Fcٓv= zBQHP. #/S }lFL"P6<6ǨP҇A13QfW[f:OLOEASE8xߘ'2PrjtӤ1;ildMvsi`XB¹tԺѻ0gTO ⪽($(ϜD|?xOMEyrMep8Et(O|oEhNj$DQʲPn%= Sx0؇hͦ $l4⚗>Ĉl14.6ċz׍\ C0 `kG_Y[G~+ q·K4q? 1jS0mX+/+fm䬏3oA#ϡʽMeؽ}n1Ih`Q8H-+˗,RU %M JBΓ9;j̋<\q ,No߲ERYډ7fEY&/=bV: n)&ܻ%> X5~g.yonBW' ep+tQ[R3I&WоrY,a٘ i eq=($(Kⷉ~ڷonUqFJ;+ER4wIss&7}UVSyQ@Co>w]fXVBumJ-fKA 5)S`H.u 6op|sbu;ox#Z=I6>n\/2˴׶F[RqX!2Rf*Ŋ#9΍ Er)搅G)#FyqQ _]|I:FcȠt(sHެz3.nNw!u,}&x f&+6H1Hm"2r $uQSOu~OU=79r2e쁨B/7Nɼ*o~ƫY )oDyϙk2sϻ{s22泙7''O̭q[Y*ʜq=ѥ3.3Ǖm=􎪡 N>ZWx$9ɮ.hⴤW%Z'x[72aalT2ctD񖬆v)ÔC+_s#Gic‹}GfW?cWH6*V-,bK.AX+R'=qjh^;qp qIT#H8+lwymwGᐌedp5J՟pHe'_qM"#'.9EA_6Y,"2xNNѷ-5q\ ٣wD,5ݿPT3G !(#E1f}ńJeg1VXڳA fbmwruÔN &|~ {>(p{ edp[Ol N_=1*B'O"ɣ^2eߋ :E#E C/ q쮔L;3Czvfeȅ0lEU^=$[O ND \S9Vkg$SӇ$*6/Xΐk+ 5N.k1HUXC"2(yz ޒMú#MZU+؁UiRXE:[ *#{!.O!u<<%UF'p|P ޕ{' 7ظs1sh 'I'2[u`n22*2-k3!CQ+7w9 $2/=!$^Ac@1N|(3&; ud f'3XYk}!վ -#S-4fǥ|9fb9Ŏ!5'WguB_)hKm|3n 2WfMMPYoe88P⥿9TN\-/5n!k@~W/|͈V{P5LYȓ5$>dAIx)C(2"kWGe~ڣL?\-pVZ-ɚj0Xt'sj\/EP[=KsQl̥"2LrrWQ]F ޔ K_s$c\b'ekTg.#8N-!i/C_ȱ N W#$]vpT`wgDlD69~{fe#22=w=Sk$x-"꿰,s׀ME22#Z'uaD'qxZ{a;:)z{]I~{Dinڻt\{-wUuM@w#1ՙMz0P0RE3Vͺ ̲ HKfq::mqJіXgyD-$ o\n8R2/=!$,7*ꧦ*[6rAn#=.'nOv ١/]4>z)M7GqWAȱ+g$ o\SAd /Z_gRԸĚ'=,MfU>g+wf.2/6kLG|dfRVXڳAգ:t?2V [zkzCV5'a{p&fW5 eVŵ5<<:`s$qh<)^߆]xkOתȱKg$(Dp 2˼K%-6% N]ҧE!<\uiOt kZz/!-" oHFu]ScQedpTm7}¿!~VϲSdEedp}[U+N3$(Ҁ>lMٙȸ98}٬ặ+tě)mTEdP|Fn^20˪k." bqpWe'"08mrdjQ)bR^>yS.#߂̛5Yu#1f 8[[yª¼*'w͇Q{Un4êlSx罡=wsތ[#hjEH 1T)+sj-A'¹ύqIca AI"L؟ 2xώX=!$ X3)]cpSeauWh2?.6 ɭվ s[DT{qo̓*AY@5Ʊ 8ly"%9y {Κ=eccS{nx uBz edp y_){9ҙ>׶< ~NZBq.v㭂(oe奺|^f++rR 8C<,W 얣#9jYW!ukϢ(= ^YILNt\a u%߈Ț98 m@?6$яiF$_\1fLsx<5F bBhma !΍1YD$P<2Iԩ(Sу%9Vyldpڟ,4Sk;W"|4!VKCc^@zה .[lSYd'B F~Bݫq%CxʄvH&܁Ctg~i*ǷD-UFFfcLQ8d-=DK7k%Wl,wb22^We{Z edpAfE4b~k 5%kt(Y@jZ+Cr]*#z %-nڊT7eْ\9' h(y^LB2 (˄=x"CLo' 75KA7VSM?A3SBilk"k63UUq7|w8nXG<4"yj%S-c4"kH6wrkt Pz|I&UwEdPuua%|55hV 襭Q?ntp(ggԖX'd$S3s#T R*q@i]F{S0݈'-j}fmto4zi%9y T*_rUikTq4U"2n2ɑyV~vUedpFmP edAylDպ\D%.%rG(!w2a8nHW$F i**X%v+3RQXA V;ID}9Vkg$m.Agk4ߐ4f78Y0wcȱKg$k:B?e~d>n'p$ 8oq,8V]%⻆~.}u%^`[`|)(u\}&F Fw6SO6<E8YBNKAA,0.ICu`_|KZ̧"tg?y]Kz^7 l>en}Xu۫bs`VaqU9G@ɏs/UhS*#8.VѽELy_||?vѐ_xsea^TR@r6b$0bEE_S( e;RG(F$2/=!$—F7wWr.EݼCC00:/^]v߆3?~[ 6XcJ'dv0a$#+{._`A?˨%+6K5g#ZX\q'O]}#fOO_0ҳ\ϓDI#@jUkޑ"*/՞ N};SD+&n ΌeR K{DnN0i$SGn荒 Z ݭ&p GYRu8( /`n>gװUߕlZU8p9prj!xj]K䘊)]AtM=209/F=JQ!AGz]]vP+ߪ2Ұ ,Y7[rəY }Hxuw?,egcax:>|1.G40mH0/՟5 pdpk /׶*"z1-7;PF #|jej/9VyldpGp ٳU5?KُP5';I:p22WI /eԽ`6v1CLmQs%y<̴g,l婲"*/՞ 4a 3/g_bjn^fZ?\z BM.;c$5쵷s2"kH6{;ƈ[~}~L#SG*#fd =BSMm^G98z *X*RY& H12o Dvqh GlM,9bq!ţQYaH߀M&~Ɲ`&|lhǟqf {h k¡㤯8_m;0>ڈRw6@2@wHt2" NonύnX[G3l۞w2wӜlnx> 7wC\ʷ(PѪ"_:*#[j$vTb!-g->||'dO#uT1>>?gˉh^\6qЊͽyl]@LUCyfKNA^ӽ Ql ur.e.S˖2< YRՠps(JP@fe 98}?=;nxq$ԤG, u 6uDsJ pQ;*Ƞ'ApL)2ZCcl>_Fwk3Uz1u6>Uoݔ:$z(k/ǩqn'3N9W(֜k'mbRzst@ü˗R(W)/L OpD_;1w?7|zZ#~$ak+rR i Bn9rX^ܷ𡱘kܝaR1)+/Ы<;T.3h>X"Xq; dee^0ݸz!YüT@2066">}Ԋplߍ&| @LS\*\JO "Ҡw<=>%{WH~ R٫2)j,2]hEUYs6(2y&eMIJ<6b;2M WavD $46ToT3u3fA Wp7"X`S$ԵR2%?c{] 4HnliGE ȃO͏F_nyпMcL1wDۧ?zs0N-SځP{ 6Gk ??gxH.<>pQ^;k ]u?(k _qqW8nκ?85;>J 9Բ%Jt vcwl|wǷ228瑕b)Kr[;8I6RFL.*'nH#x|.!Vޤx0 {vu/:5SǬ%G\pUg#rJg9K{AcV{6H?G9C%8G v;N*g8NnhfX;vYwptuP}Ͷ=Xr0!otφ2;\U;ˠM|_5B_C[$IFb=th7}_ 8p +F"-դ/g#Fn2:kU_S9-1Y۽Uߟ!%7ahx0+N-SɈ9Vyldp?a9"t!Y\7NJ䜅!&[6 x<*_O\vH]C&|7laȱ+g$ ӣ!\e/iyKd֩XɺÜ4ې g # 2̰+04gXU~sZ=Woo?Ewrz~6dlRYȠf9LN!~SHJާ*!  E b" LT :MmIe^zB6H28eDE*# }{nrTʢmHzM\bD>SRihh;(2wpOUG"?,fަG&S&9rt}%;.՟ lJy)t~*" ]픉&ӄ'/BW P3^J ^-zzv޻22on~V`D@*Eș\hVVಅ(W]b@GcL䃐Tt~Lu22Z׊Ј-qy{)oyU\D`.] _[7 >1s/qVs͔C H3e +WM Zia9ߕ۹6[|M7ǚ8*#Cr=a(GBV5H{E# )jߒA՞gi]ڨOpɥN~ #͖0z&jS8I^LA!ݚQ niiZ"*/՞ naF^8a9+۳RiHU_]9[2l.eD,<͛pԙ>\[ab2eI!/ 2{#l3%>ͧX}5}:ȹ&cd`,Ծwur,,5˟P7kTGx}󤴚''[TwYgyD)ja Ud RYv昐g-dLrHc@Qedp}cOyƏoM̑ĿL*Q~Eoɻ\[ɌJYȀ>p&F!IG-|ﱇ={m&6^'E[I+O>ЙlJ4QVL5tQf4OoktEnVGMkMq::\+~t\kk>$!{.,i>|h-מ NM+v #WE#6yJpm*3:$6V.U5 搞;`Nvl7w'Q6Imedp Ks^_t<{4c]|20}6S9)N@:z.#{:#x nu\`L47WDoJohY襡 V6%'f*3VꞼ[.Ia+3OOn}묟xPFן8_8n,%\!%#/|TWoS$ĊѮ879#ؤ%9y หȏGx@OhxX|jlvwNWPUbŽa,[= /]F3hh| :(U=q.S|q~Qx u%9y ྴ.߻.GSs{?!#22cgwQ1ȲJ@|nr;`Iwc ҏ=Tst|bPbR;k#Fn`;ks#C#ꭙ*#}!/>s[gtV8 !̿.畟rY#%9kOIһ5%cvFy_xR}//dB^W}iʼP7A(YfGGGu[St3gz,k

    wNedpfm_yn2=)ksP[PFYv:Zo ~MKVedp&9 ݽ޵XFJRv~Ρ sco3}kߖD1mB|To{mow>z{nR%;=T_eImBYOo؇r>vȷ,u ea kj'#ʘM̩h{@7Gh-AMSZ#u?e8?rnfX z.=N F"5PFǟ0>jyU@IKu5B)Ҳ,d|$( \VX'd$;݉J(n"'/S%]qɻC•e 3KH6gmMIY/=]yR {//xeVK'x;SGg4*T#2n:@$ Em5Kug $9dsFo;$.l%1Q: ^t.#S_+!'GsXjCr#,sg4T +gB-a@Ö!mEU^=$?3N,ܭTp=wHu}aȱKg$],G(dU2B]Dl2 U22,R멻4wGy'ʻFNy솔geR:;Xt"N%0l`#qTcr cȮ.O؋ >YzP2ƕȝ۶sN&v?nW%(0{ n o6SI{K2G!t$SrLbbLb!YüT@2n4 ڒd/oؕBYgu 8} S;7{Ү q28FnclUCuhG {s22w(W Wr8\nGs:.qΖX'd$; oF"zKz\^]EkkRu8{dzi.E&ziVw )/]v:|DRyz2cD6ByMiO_2 9q{rm%67˽ոTmEU^=$9'n0>Ͻ1Pk/ԝ"*/՞ n{㶈]{xN6nKv7![V{?ڈRw6@2g4cl5ط'rꅅ2"(/T 4:N˴2R"QorPv' /+rR lM:2 ^Sa+]3R`CP04)ܗϝ"W&l)p*s5edp^zpw^rq>Sedp$ SNB4~;[RG #RH{O܇5_8N c"bL،K)aW16D~G YN CjŎ#  tβƍ,D{Rv/1vd>*o>Xv>fZ/^Ho ^)xd»5nnxPF׆8!L\ KJ!{_iXI-%t@<Ҩ8[c'dwۛonֈ^W\C\ASAyB&HѬۻތedpED|euvfc!BC 4 ş,9qKpi=^`ɪgCf"!CgIq95G·JQwq**KiXJ27]'6ƀBF[]kt\L Z \j Kr,מ \wYTNjq/ sQZ7Kg$?% xveq5 W +kF\;;n;L],3uD&s2PWᥡUtL}l3ɯu]dy2ȕ+.# dޓTېn>yMLOz7B[|B=Hr?Og=_nm6$0ԟ lh)R;[v*#w),i;0<ݱjZߦt1[OUB n h67A&$e#يT{6H2tt<0_Wc3d۟J>r}Hx:5Kg $rU1JT)mQ.]s&A1Xf+rR Vii%Gc=Om,u$a=dDQ^:iTn7yeg]K{U`opH~K*$əx|7RJ/P~:uy&' ?z*#ݛ;cb-!pY{ Bߓ8}f.oeg 3š x:0AZ J4'dGEnth/ DgE,Ik'dG;1|}럩,l."LLА8& כjYlu)qK Ek(#Ip)sx wV{IcVkFe?D4LoS{=Bڒo\rAtʘ]pksɅGop$tJ.Wq L ZNVV8 :"sڳAwR@9gglRn+-Y bl#O(o72)Kr, 4O{Gvp-ySNR:P:p?$äw\_Uet󳟶ȱGt %rpmucgb^z7{ɘ|ݬ}cY'ΧQ8ih@\>5|amng1v7_\ 1 coCuHêт: 7ypF #D{;5? f*3@,ɱKOI;̽i2Ki+ǡVj_=, ]>.37ɣ^Qk\kҗ[yB^].ox?K$٠9o;Χtrw urcV "`dAt.qpfc22>k͎ZǹZ|pj>d,yu85Yֈ4ؕUZ LP#^"Xb4W)wMtvoǻpZJ ;62]D8>wc-Tf4hwvHۈ\96\F֟ ֗Z#~M%Kb Hƿ?}>"滛hg eEU^=$'^z w%=q-՜[ 4nMb v¼+[o{NȐ 9j mIBXI6&g͖X'd$Vb\]{Yq/cV{6HZ dpjyҿ27ڭ$6^C㔉N>Akp+BUzPFd·Q2ǒp礀2l[]2$kHg<+x20}:-~܊M@:>vhKnԻ@U/ h)L -0pʺ'WZ]+ȱy2cxlGx840+7n 7ٍxm>}aޮ:$Ap >p;-ɱ\{B6H285{䗰lYQRO᧓223A=6g-G)@$T=iˈ"[L.#q"\8ʛ\XOw%xV*yj(#3NkKAU(D*_Q2o+YIlIe^zB6H2h_'h%~iY2!CՖķ~MaIo]{ ^AߵH2~֫2Wg0"Ҡ>,)&Hxdfb|~ߞeY;`ٰ\ʽSHm3øKQv $ڒ˵'d$;"H 岣1Ձ_I{u۳7ҭc%Q={| ~T4Vn:w6IJi cWVXڳAMEH %NU^åpƷUP'D $]7;g!4uuȠܞ8wKmkh7}3lfdqH[G=||/j˵0bcO4NNN0_rn*# c .ҫ#่\5߀7bw ؆JҒUi?e %te3B^ȠQb7Mojݒ/>~6/yGѴbb]X|gZ*#{wdu KO#z4ϵ0rͿk_TfnkOzdx<2<$-# ޕ#$S{V?Icɖ9\^ǖ%[C_Redpu|Ex9ˢmJ-'8m$+1Q=ZYx㮶-|͖X'd$yb *AӜ$E' SUrЏU49Fy~fZ(=c!)zPE xxx¸"gKr,AAD1vqC8ȱKg$SnG9inWi OGӥB05֍.# b PxR jH\H9.RK&?9.Ӡ\*h#Fyd`B7k76O[gT1j2$0ԟ  Wg#9یbU,jԞ=2m;ܔwx:ँW8>5BfWח$,ZaF~༶cI8o3`YxB\GRu˸NwgM<%)"A@ի"*/՞ nkJevUsۿtU.:seg}_ye}- ` <W*/՞ yZ)͓FM[e5I2\yvy}!T L.U#Og>u gO"OzT-W<.UrI0< i7byzB&:t+A<ǵ 9 }+ gb_Eb".Q0+w܍ղ4B+ ?zm#t)"2o8 9jxVmVn8%+OXՑC|ýZ;ssv[<Ww|ƒWz."b*'*9hSe4VOm tkEn#\cOBKg*Xn'S|nFDZNWXY?;2> 6 nUO|#qUedp1Yywʪg\5*֖.N,UYyªfEҨ9{ 5ki@=K'qdL|2uWpE M%9yIÔGF{DN+!~0+&,{r+edp9YzJE\LBJԖX:&EuІX&/2?Pj$ĸLw|xm7%Cb);'֮TfKr,Aٮr~QWIwKS_]v⸢W๢5w[%l:ސG(T|ġU;xD+p`pՇmN|t.We[([of}GJ2Vx,ɱKOIR=ϖb|\쓉y;28;&ܷ՛GeEU^=$0u"o*)/*# 9i6@_Hۯ2Ұ^ 4P%ފ"Ҡ:m,HpG˙+y~?\ .n_ 228vH/3ReR?-=f J`rڏK.Wz|͌C¢20%9y ঁr!;3h8[6Ac]f6G|r8#^@8^U]n%9y #68̶7KJ Ռ+* T6xJio:OiRKpS/ǸXJWII{UkUDFH,\Fi*)6Q)ANT59FYGؕ'tT̎2h_3n !ҹofC[cW*H?H9*OWbqo*p#̞9MqԻD{TIέJ6>Jۦ"r~#c(|soę MYc wgᏵׯ%~USB/lbݳ9Fyld`NsF$kh@+Ivsu\u-ʿW'[^pHlC$2/=!$X˿Fa<AM}oD:vQH鮾,+:C6?|QYe$2/=!$nMjFxja>We>ASQ{L=#/m-W5\ꁩ\NG]OCf.p}]ɟ>IV݄̝g9lT <eIe^zB6H28hnGꡂŬ!٢UT9\&4X;ԫ2Ұ9~ 6^#A9oksB=R$2/=!$ܼ%O~r~1(\_ [l}?Oedpfs5x JzϪs.C`?x !2NBy1>@3dG8n!YüT@2~<oA^gY[J.h r\lvޕDa.]IpC]wi/mbb {\`lI.0vTDwmvH\cedp !k{ N=kmfUS-AY_j }c-BK4@:4?|`y,ax!"v`#Y])X@;l)S^OyUE9V^=wt& 3}q+q] ]n50ro^˂`a ac8!8WW[*#3eCHvZR"ߡ~#߷U+5Hj_W*g{=1J"*/՞ nḍ%v)SCBc9%nf.# {QDulcໆ!2 ,ɱKOImY,*J~1#nOUPY|> +Gy;*/9w='HaȱKg$UPڧM*>0߲2pMvcERIh8E6K`A{&lo2"hlpQlc P$hN'Ԉ/P>ƊڳAMsepK`-a1 J Dj{c+).p艽|a^?k !G*se?t> 4J5 *Uek$Wzp0'vI;1MIݩ228}؀fMMTz9 ~f4-%Pyz@-}gKv%i|r_콥!9[FZ: : +|u]F;A ݗk|$-dBzv_YS 22~ӤOMZ0<:ʾ#,лXcD1 "k)kOedp KRgc8NhOܩ}]y$r মqDo*vp.##LGe3w%?SZo#u}O0/qtH07p&ܟʉ||d˹#*nӳlyjJdB$/ԛ5 h)\|(;yz~K 堡2J(xWMmIEU2!^7Oeۋ^5þ-i捜_+oosk/ܒK3)_jO:.CiQN &XZdb^3UԯPt/`}܃\ @qz\ȔW6H.lozڳƑA.~}ӴfܻbuL^wC,PFWAJa޸.cE8M.%vIn$2/=!$2<.$bPft>g ui3l1@~.*xU̵o\2|W3FwHKE 4Ƶ%9y m`š,%+E bm[MPf\qjcw%ZҔ@"Xܧ-\,s.s -ɱ+H6ZLvip) G=!e  9FylpQ\p|e%IL>oZci4몵YAI9 `lqY`o1\2y`zȱKg$0D,{ze窈4*8[:[\F׭P7Js>s;JV`HRARMWR[L2T? B#2>vy1R],}6Kug $W!}W^x6txܛ2"$ng}K~7H$r Z>QYoio^%oa68󵱬FKQedp*UAFixPFk| Z#22kmk|` 5NY~K5Մq s~4MU+ru;VjB,ߟ}^2]Eܛ9zS|d'ȱrM klhtDfDsDtT\!V#9w8u e9x4}Xc,ឭY_q 狃6$kHf}VܳM* U>Ilg)Av&[/dt'dtn]XYLp^wKӝCk hyຕ5T[]?'N44)QuU34i"_W6ӈ,R߈gdd]2$k9&+:ilF|b>.׋ʷ<\m)^_~OoϷ*ԡBFa U^=$\ȻFFBdžp|]E-U54joZM+TYof֛]mZ\A8\uԱ 1rUU Z[޶ ]ߓVn4Z$NҊg sRFd熃 #;t'&HĨ{GCMCiXHQ s⠗Hm UF>PB6l-C`ciX7UXr9GSe*4U9L;t݇evމ+\9(&Ѝ=-Y<qs vfЪz^[cjI7.vn{%WY VyReaG3%U(F_j?>D'-ɱ\{B6H28{gxU8i\o NFv_CpPFUusxaH{ZPi m{VxWh9)yls|eN>2q.~][A"`au ġ neR3k8ob*lB{eIKf |g2\4lmtmKkͯǻl~4+^9,ɱ\{B6H_hO>ࢍ'a;I;Aӿ#$&T 'D 77)#y Oփ N֟ŷp!JV&22)G5ː}ul25PS/"g uDYvuur:y֡]ci's!!q?W= ^qY~RCb z {gKj =S#U\՗&*I i2'Xņ؜e- SBA!YüT@2y΀XG샥+-" ]Ut~7 m_<$2j4#E7I-)7g0"1VXڳA-tVH8 t&pRj̐"*/՞ ~|5/_p! 5L[cjI>F^3 /$hJp=,T{6H285*# ׍a1RƲLԽj5f1BOZ"rnH< |88YcjI~Pmy8{|LcE>_Bc(tX*FDEuI9oqx F9Vkg$7VQYԽKM4*]hGso=ʐa^?k mIlK(tĦ7+_g9&eNzf牉Z!9yld`.xխ,u\=ҭ8J0^Q-G5! S731$d#*#3NE9јRٯݞ-^" "nv!Lu?_85ev č3BiPi0_<qp 2磈$п_edp}K+Ǵ'?਺ gkxɏ JeIAM <:Q<9Q/Co ꯉuᒗ')ʧNX._#+k}K~p&=с^*#gshSWWQX[ k>,\kN1V_8~WH40~iSN1oNhTw/{"N ?ݥԡ1rVN>@6~Փrl*: mWedplֻ#mv=UJAu@P^}}1Hz+[AhJ+H@+\l*#K`đ*z&ÖƃoV 7vһ&gHV<ۧȠNʶ/?󱓨Xo\.Z enQ .rowE_q!xo,ٺb$̕{2e£ϋUiF^ieIe^y@6@Ұi\$7Vp ~;,Xwi6w%Rm~W%ђ~+9FЪAr~&slޏQAF!YüT@205N.ڿSyc٘*kjXqv0ʃ痻t}Yp-^|oFAoq&|m5/g-QL5Ǩ983la`㵨p8V͕4_yw4<;~y,rp-:!5o-EdPQ\p㲈׀.V K |4*Cyd`ײ.2{"D]|vwȠ'm<A54G/$N:͆|gev{ڒ.SE>9l)K-#Oo\bcb~ fa\G=R\跥pS*w^a%9y ''sM\Ukahn9]3<ssƉ$FG I+hMwc.#6sHFFժp~_-Ԟ-iAPzSd F6_*$NedpR>vK4C;&2Ұ^,7/JAsrlwXQ C4Wu7~:!6T:inROu22Gkk95[V.N$~ķWscH(*"2ZL( /SPEdPJ[θ4:--{togI22~8EcSǾ&a2ˇwɖeՕZp;im(]U^ $A#Ҟ%qB2sr0k⤕wa̺ЦOu2\˨? 5l__rxLlNb+eޕ|;\F{[(ަm,l8PFVF }C{e_L}e-vfit5JGu͂L Od=W摺!2t}b%[e8U?r?#ҟG#%LPp] 1+gEyq}wܧ%J~1?_akbw.iUQ O)5{x`V{$NM+ ܽI qȭKI l)T!kEU^=7ޗƻ+qw=%Y6dը{kEU^==}$_RPB|(N>ɊT{$Μ8r빼Qp2K ;mR]t5b<%#Gk(h\SNVBI U*Me$q(ȵϹW{b*"$\>!39%ey .19=#a\96[Ivi@ iyŏaXIVi;y%~} UJ3?`篯Ծ8YkUV,}Acm|*5/st2<zXbptCk$Su2"lES%M,;2 N/e^y@ YX$C~~Ym g=:p$|6Խx; OSVuJeQZUYMWpȎzVdU2_np};kVkȔĨay3sOOǼM͖}91:jѦ?}U8n[(ZE( ğS'֕YMNN9ZcI32bq1mJȲS48v3DV;7 ߭ߺ7SMيT{${W FXqKJn׻X EbKu-Q:w9Cˍ;Uq/ w*֊T{$np;GϭtG:[lʆ'mO9H1gXYüT@X=Z=J_bd4M򸌧DmS%VX3LW=}A8ɄBO~N嗔5N(5Tg#rJ/aBa]FC_JU2و#VҐs1X}b?,"PFkJ䎩FFyl_|j 21A4ejuz挄oj;NrDh<Wݮ VO2E QBvVQ=\Ɗ3LW`X+IΝ{ugʓ܁U2/=!?cEQ|2iԞM6O EcteP_AsENH^TL T)Kr,מI[B+h-J*-A˞=VX3¦\Z87+w@Aᑂ!CA&g "8_e^#鏑9CbjD\q$Ii}IWO;WR:lՃ&k\_cX4Vu88T>t yU 9?]2yZipU,=+oQWwR0x&qª+W{haȱKg@{\q&r*_&AQk#BTw@8+ZKE_%"׸rZ+rJdas"ȥNfgY>NQSF[)b Ago;j` }gsƀrQڏꉫo8%L#\ cDhH[9!*ZrH,b 1"w.+ŧpJSb~Wys3u`.4B19WÂn}t8Vh~x:j"!ajå3 `󶚯9FY6nؽ#y=i*# <JF)/>UTqhdGUNvvI)"]" CiSSAoE49-i8q]cHaYy͘ =ܽ:_J7t2r )7$cEU^=g6OUaNȭjJȢNY}w[]}5+$}oW2\EǙ: )"KK|=r %/5Yl'K<-ߔފ7J]˟4,Y5pnZ/HDr{Ԯߥb[29Il|6nw1`tE}FڶJ$81g'W hcA5\G4@j:K:V5"W͋}ʮ"鎍].Sg2ǵR@?O_ջ0l_ўk3X! eU@ (kVe3zza/%(MN8c ֡{J#𺩫j=?ؑ%t$YêY3Kr,2 ps?(Y吏:k,d% \snN ! QKn{׆CFxv (Ɗ掱$r 8u!a٫mfehW?zEz1Ɋr2kòw' &UWkLgM,4;'%mIr?%9kOȀ$͟y}/c:3e>G8G][g֙ [tAA3k̵k r}e=+ie٤!' B<79lx?^ [|g癴1ӜPFVXuz^YpY(%\Sg#BTw@7*Z[!AҨr( Lso1Xcjπ$8rנ_;H>3VEg徂YO3~gՇ^;)r*#o}ߦI2GφIլlt4bK|_Go0+ugc^!ψ#'V3җx%/7YTA8$Eׇ|ݪ#tHލ1{2WO w| \/;cʤIḔ .9_[oש-Qz$2/=!7{ pVtK&E.fMk<[K&c*kF0v(xmxAΕ9Ki+JԦ>8y>8 ?a@A'1R(Lw>'R((2p_dT,:Z$Dzk>qԮM|M껄̟{Մp~J'qg=.דc2\oGgJ!$'A݁Rv@كV.fŵ!IY2Hx^Qwd6Ѣ;4]_ݑ20 ~[aޖGׅK HSx5%dJ 2cIe^zB$LVR)`,3X3 %0e~#I~zdpmf Fa%Xyd7_D_opoVM{qS/#n(25ɖ'Ļ&7,Z\o/ Lhu^6wxk(#sD9!yEȩ1om2m("׭CU b8ťWmiϜl[蹿B.c ~[(0YϸkVzF^o=p*#JMPe{fdZ6rw.匁 qr=|ԱqhGTF/'ȡCU SRk\&F[SnHL_Uvpf/J z1\QoW/|$Z hז}IP2EPF3F~FMK;ݛL3Ko &M|̧i"GcZKdOwٲլ9Vy HܼXC0cϷ_ e~`0>gs4aNSwKo:"9s;Xcjπ$-|F=Խ?+Ū0\ZgqnٵVX3 pe0Id,QUO/]׭dGpѣd&6zmTGhqU,dp]3-{s#r$%l9{`rFϭj8C@$2/=!׭*N)Q*!Y8[YPe.[ꖕߕG`nO`',pkws؆5I =VX3 pܙqɸ P GcW)(K472R&X* Gc)~J%35DkEU^=B9\}9[tXS^U̵zQ^:[YTQMB1[MwIsVέZ `ƃ[V#>vʬN?T7fF|{7EdAv1+o];`zSGuۉ>NW*{oAP׀ziݍLuUlDQ^:,{Jw/ ]x?y6!+ԏQwيT{$n .Q!mG$ߜ-(IޮиGE_ugO:Ȁcsj|jjD$+ap~ҹ 5D9q] wGݱ-f&%T|r$wBy"8\F rai?]%EfptJqJeX>/-#s,y,H(<8kf2\6 WZ }([u:sGaȂx0`Uk[̢Čɺ".V.dcTՈv2$bXͭőN"™| cT{$n/vhqr_s@/%#Z?Krƒ˵'d@̸ e; sTNkїr?{F +l4 9&gPd1淗YtޝO}%xgTV]}奺[k:_&b.EulP[F.1w/tz7;Qn0vP,G r47y 8I/=%+Դ7񿐵wsVieTu/x[°lˑ;Goss GA>e— A |pOX EGu&%e(N/)d$6<9(L`h8tM,/_cj[2IƆ&Ԝ-e_m:d L,WԞ!$XoKpp{i7NҶֈ(/՝-fY@@Q#Jֆ|5jAM 5a[= c~\3L|)3s앶T,;UsE 0 R֒˼ H݆Lk4.Wz&_-;x$pxvZcjπ$- -~|[}2 ne2⮿?.3[cjπ$ 6(-kD'ug?V??{+\¥fƈRw la ũ1MXoO/ss@TH?ms8MeE˚ۧG| i]B қ]/lʎV2\L9X殊7i.#;$v0JL$~C9CTrͼ >cIe^y@ YXu-~a's2֣mL6Yhu5ڠ7 ~~G'^0aKs+H7;E?2\yPs{]: qQ}9VV7$3m^B]8ϔ:ğ,R%7Xsv&G˼ o;>_]\K2Hd[cT*rr Еc1+ugɚ?E0'ԯ+3c)xVҿK/I+6p ݵR*ڸ~M~S*:lȩH]; ;b {XIˉ!ɾ~˸Y$WDɍ.M XcI҄_ED}:X8kŀ奺x{PY_J} RȱKg@UN#.!$:'{sj[eKI7+XUBn[g8\.]m2$4Kg $ůHlaKKgmp-<Ә*[r۶h|oG*Wڔ5bdFiY_0K[xfpKзhN؟SBCUE; ֊|ͅ]GaO*Bx/T :S-{ѶFK&'|[FVWj%AbwOe>q;۩FKp. XcA*M{ bܚs GV |MJ3;kp!P>wA-tyU>ns{UyEwzG e7~\P>:qCBCOT3 ޝð8Ɲs3Gհ7YYɂSvG0[cId?a _eؗ;pɮ@6Q6/Լk\^[!1G|"ΞDc$)ȾNK'4ϏMkDhHO(|S)Fjp}AO:KQTm{[F'{I\e Q)op[< }ڋ edaݑ[Mґ#B92tm8J-eI%Yi˼ @jdA1q|<9FZ<ܒ R M&m(#e׵W 3ez:u8߱Z[IfEl}g:@RY燎wFFι\kwc7xFP"(Cem{aTXz?2QsQ,IWʬuʰןxK_? =ͷͫY0++*ؒMI.KUTg&;sYϲ]9cR \=[NR:B,SlKG+rR8; 5ca|#-"Z6/ u'1;yzJzݚ8:BETϧ# oڿ{R?Ϯro礸&noA1gr_*/՞Imb9jҬUceAY$O +:xK$9ZXcjπ$MH`.{ LCO'wB}%HlQr^s@ɐ\=![uiV~$"BxsXG U^=g] {܍ $=H;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:Tobr_:h)K֊T{$n3ȹZ3=gk=g(Ж<ކ_jxTAZNVX3 p_rԛ\Iݞv 2;[T{xKkV"G=!5>KlOٕJ` H#1ʥ̨#Yjpڅ IXK:`!$+)if|cGg1۹gߕiw7b)G$LWe׷D1dݰzBHCapdQ'9}]'r Br8]#C `EU^=5B Q<{|Vcp^"zjx_1WMc"*/՞I î]@e YJ$?W%;n;gOd7B =ڃNoۇk,ɱKOȀ$45 ^gخ5pW r8#sXrI| ws LJ݁Kxv!29ٮ.1mNSBR(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))6U/ Fp%*I^) &W!9y @7/p:z)(9n܎0J%r˒{nϼv"?MAn]uʥ V1وRw lIB]B杔6XarhU-S΁O2(']"?WVKu͂n89zݍ֒˼ H&ƻYq8HC?r.IO䁡o'VH/R/],f}wBY iggbY9#1I[C$ùcf:Ӗ$2/=!{rl;*H8 啺3\5ot}Lz'~ :'Md3}ڦKz6' nz1)_Fn]Kcjπ$W A&Kf͔y8ֈ9G\}ֹ9Vy @0}BOˉ\rӽ5$P*P+ gp[#FZoݿknV&o%Mǃ[|~/Wli!̦חǡ~?]Cwkbe1&}2|疷N7g9tޖ~vUep+s'cUTSv::mlHa^>,jpV-amcãc])"@&ù_anbwb>[ VlHDZ_`T-ugTDZٞq^#ۢM|%-zilʷv oƒ˼ H6Ů}&}2YjE0 OoS_ų S_yB$n$\knI9皧SN̔ܡAe8yGk.%('l!cȌ!9+gE j)L²8xZgP:Ii~?KTBU]^0!ն՟.K9aVEr]yEWy9kӄ.<4Ԕj] V@O &m Vn XuyLYߕ4,<YXP#nB2ŮgȱKg@~ 锗ɳS+U$w2r7 ]OVX3.Nvʲ2j, Q\d"7d)V.6*JuhȱP;9z0s9$?ԣF#lNgCFDںU%E ;ߪ20=h$.GwHww[F΀Q8t;+Du CEjͪFM\TLuvpG5xW[a#h1A!5XZ[OIg* Q#K¬FMOo/)8UzїKL]7cNN8%G)(Ob0[ErhXcI[MtrFb\QEŎ[NlN4[F jEɂܒAMwXݹOȮ}+SgMHLN(;S}72֮p:rNB%C"EJ>ef=ufa0?t 0q:}:˓,%,2Zcjπ$S.UVKu?d+_v=SV]+ jVv{n1v{ 0.^M64NܠwIdz_YDϵLzjh7_{^U~ijyUųVX3 p D @hף3SɆ1/nIX<=-Lܺg_ qj5ΖX'd@njrf\2p[QGl4%:u` i֒˼ Hyc/GBV3wRY"vN* SY>:Hŝ$p'U|v/Uce4E,UpW쉥sN^sj|"hp2Ѫ@^GO{dC~pqָsoiA?~P7N+v+5hQ.!,zTF{o{hBXg*"@uquw n1g6s2`j!De҉)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\+]S*Sn%\J<1KVZ2YϕwT[$b}`TYIvs֊T{$nN{*{5#DSFb`Yz/jm%,G2[+O7,N??H}vhǽ/ԧШ.j`3H'J0Gi1"4rl~IˢNTdjπ~u͂*;܍?/TVѨ*e}Gܠ0SF&F\մEE5)# 3e*z\ƨWiPSnk7V#[~#'tR7Wۉl݃tMw"S:qwD2HŊ] f*Gu26ؘ_J6罶/̹*9 ٙ+Or8<7ޏN҆2][<-YYE" YSFO;|M~Ki~9 ,W Ѝ{?%zU.h=n."@<+ ҍí"E2\oҩ! !ao=c{) >?m^B鿼L˫B3Rr"٦TrkTNa9?umθv VYh"kIe^zB$ZTX)Y ]ykو3 `0,PKT (ٝN&uB'S5[+rR8 _atA%~UP2vGFԛA"&c"G2"SL2XqzKѬxcꜶe81x`Ȟ}Zea?2 G ީ+O_`&'1$Kr,2 pꮤһѺ86gXjOƈhlylڒ"%pO2K@SMOKg|[DYU7kb%[ v0![FV)Ϋw' 2%owE_ Xv+NI |7).g kR:cIe^zB$nx!΄X_yh^7 O\\2\ka[o>38(vk0 $rj7)#iL ϗ o 奀PˊKye`J؍巬Ops_ nK{;%z[;i~?~PXp+s@,#1(]wʥ瀠3 ƒ˼ HJa2C?̉1^Rnp,Ho8qsKܞق tLl8d\ 2,krZj)r6Fʶ^Tv$8]uO ,ɱKOȀ$uCIdtHs֍x,sXFGW<&'̆ܿxzX`6$2>fP7N&™Nj~J"p2h9Vkg@~wlP׭ݎ+n'kto1Z+rRS_,W׻,9m1In9^3InjWg+LlA=U$qTô9;/E}+UOa^7^5Wy–"c8ێuf+ ɯ?O=gr/*@0cW$١{^SPr7';U:yRHQKqKY0C5?ҞRP\@OQ ݱfH k_U*/՞RݯTOMo11a^lFyqi+{qiY63G^LQXmNC GV9”ӏ)!M=:!9y @X}cH𫲅#I:*3ȑ ?UU-I-X+rR8\#&2|a%cO/}VW;b׽жcbK*8ZM}!O<5Lxϻ#H5|zs9V^cbS{ZS{m{R6T\yom?2 G,hθ,S܆qomT56@8whoKӖv]`p@ ^wWhޑɣwZanҞ??|Eymrw]Z>~;_ 02\o!>(#Wa~eϞi|bX(hW4en2`pٮG2lXdKi@]("TV©oo8گJ7iޡ lHLpf[TyMoEAJ{9hhm{j-ɱKOȀ$TϤ*q[[2fdAq<)^JΉJe]#%9Ѐ'd@Cm ~u؞J_+^ [F>[6Qq]̋785'?+\{K8EVs[\ѳcPwc\3@ܿf(JiWG+ڹP'({ O G~uܥ%?S\הcDhWGoW4 .0xY*Ľ`Jks,o;y3&d~lTcmvw+f*,\!vopwpi?ݓ&[2< ,ln&I T-S1=΅Яwg{S$lB7 7֒˼ H;+AAz5ԃC"To.ʻZ>ZDVϦ4bڟ.dEQL7I(W`0dNaƪCBüT@fr"2J]2fCNWS2,fGꝳ5%Mu>MмKoG ǎ1Y 6D!eh!W/uc;M0Xc HiUBGAmtL epoM+/SHÔકU8WY"wuK`vRţ^*j u*'"h rjLOpnOk҄ܒ};Lܻ'y2/*$n2߆s>{]0EKd َ.Ԟ-e?kĶeހV'ΟZafp*C 7CήW׶#gC/%7b^ĹCr1"әTi6[cI3rlg&t~]-+#8|cj9|$W,k1mWMjrXd,fM [ɈRw lKpۜ"r3(40 FYfXcWHf6@KUك^-r*ΰKRBSeC%SٓDe¾qs]wę \q%uy7x}OuX Nh8`ӣtFIԖ}w\HYs!I+3:gGaKJ0S{uoCTPFt!\\Oi\iYˢGf y]^<[Yj|nbTe´^0]ޗv跈,]*-!F޹c(#աqH.~uAјׇJ-k&ty%L#% ե{au2| Bԫz=A[z|jap2'%L7Y͜i)# FGVR1z__CAɈ ㏒Hy 8ԖSr+ coC9("TV~ O0E=AqnK*_wAeQ>Jzkemjt^RO OXaES,  Ɨ7W)# {*ܾ?}y uzKX׽*wkC^>4䄬dHXSTK+}? kX`ǣrklBk.+v좉rU-91^^iY@#;*4U^=7cW_W2\;%F6U{.s@7G\D3DsW%ܬ;l_=HiM˕Kr㨠Bճ+~~\w٤$/ui) j9,r)I_\UѺ,5Xr1YOT#ƃob΁ÃVyj9&iJKQcW$Mý.%y$Hkqq`@+͈!q9F~sť~-uXɭ7FߵH\I[{î(^-b.#i۔w:`xN}%FW-.) | OX'd@L_jůmϖDmp+s)O*P÷7Ѵ3XcWHf[gaZ%/}+(-)8꜑sckY<~ oV}eק*,ϻocIe^zB$μ FO * .[>Ӵy/j\cW$[WJAëW㚯|KlվTiUmJor~kcGhWjG2Ma#bpzxbV+LG^l{=gF{F՚+f3fIJVX3 p6*w&ow}ȂlgMe2gy(Qj(eNWћOXkHܳ$KXͺ9VnZ Ԟ駕 T+˘2sҊu^#5IV:-WS,җa{,_rYvغtqĪ2䮔rV鵬9Vy H\u^wUN<6m~3@z7]/Oם(p W u*Jk]e<V>J> e~Ik8"/ϡ܀*^l|i[w@FfFOFVMgM4i?M9O3wݮdN^ ar6dyTguurj-0cmPg28r%9y yy3Sf=|szs\Wۜap^qJrk@Kӡ,L@0V;6'% Iq<8ǭxワ;>"\2\pp֋H}aߜ٣6X'd@AS:?:vi & ~\ k/~4 ෌<z21Ʉ!<&O@ J+ss`pҪ2(k*=$B7~d[Fή[ƝEKy]&CMa:ois͐z>& |NDhkb܇QK-n^%9|`ĨEGq|ݒ>MN<7F9ns[sւM}#=oN:ehX;_3%9y d[݁D=Rmw.U,3i[a&}p݊]gʧ{[DC{E958Q82`R\ oUCzl>4(xcE; /OengnKߚi*"@Ǖw#NVX3 pKǿlw=C9;k#0HwС _2_Ad(#96^ *,M|i]9Y#]&䊚ŷU26ZzyҮʓL̦hޡK;4]!9y @_o ٔ[.UBSr\m`jHmA[[D7glw6P7F啺3 `to.ǎgj݄s%"*:f_.,Ov'|V z3SaRG:79&œ]$kbR `""\FEJf[aoUo#\WUzW)ִL5믩XDjٺ>-h'm$!mp>ӯePFVAxhE^$+\о7SSML)Ax]7MJwsz/:O kӄNc'zJۚ@3=t48V4/naHGlAVQG{qvfpƤD7[͖~67CC\,u.B MXt Hr2]p]'&:Ta$OKiIOEU/ Oagsi.f:̑')$2/=!q#?bx/g"bt+״=/7#&]_/]ަxMlXU&#8?`%shi,<|5WYۃC$dJu[VX3 pHKUqk X7i\ #bz&]grtEN|x}ޒc8эb 1tm '(ԥfg["ow$QE)H{޲/أ>hEs{c\v}.8W}H][(nA}h.#F?*7;1K 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\h9Wh9ސy3@f8ݰהK[1xiQ?ȟ>(hZAZ3JտlPN 3vH{St$m4/D/Oy_=;`zh~:hO(bʈ;טɠc&i)`mգ?$0cF2tƙ%=T5LdB~]Ej*4ESLF mʛ3Lj:UjH|[xKxp clmK,=($(p7ED8C$|,@][|^5/%v|BQH;khzKA@ZABB m @)@)UC#wŔY&fy0B{\ۢMI*Me)䟕f*;궸DN/s/35-^YOE X/Ó&W߃ U'Mo:LstT&!C ؙ;MiȧRW (⪹(x|^A:ЊdWvtkyCAK/ } [z/CY:d%bF$4 m_%T?L)[|y ?a^k]\)'xvkQ p]hg/;n.3W_e(cV43K"Y[ mƐ$1n>7yV\w&+M ?nf|+ -~2nNl+(6N4'ѻq\6mg&,_'7tUpcy`I tNNnP $mn TFsַkh n"/LgoQ 7BcP1ŸMRyT nQ1<~pq?S=ewa1gh~ OukK$=(P'} Ĕf2OʱoW+08LUyQ@3sW\&㠇KкAZֈ.N _=:yC<#@zT("#)2lJ^j[b`?5vZ8欧0EIK0,}O( N*' r[2P8:Qm Ӏ³O B` ]yfòPnuM{A .EPli2o8~+ԷW8O/E .rpH+CSIdLiRiS7CKA8Q Og9k?c]"PV;5Q{}t;- w5%.Xy)gLgN9w*/@ s;{br]E(ܫdSY~kf=;N̖L.(ksy[!8sc'Ig&/ǎ2Sj?E'#~ (T:bC3QqXv*²M ⪽($(쥒 Te6G/UL7Ad} g>.;wc6$# bŮEoCêj/ z)sl|) 6cUUڞBBt!5r]{%pKY9Z,3BZ2P8z |`$-{-(\WԿA/$ iU}8uYlYRH[@Qy["Ef&T 7-FxM?zԃ(3'sผ3qMÅ>} i-]gѷ!#VڋBNz|x=~Ƙbc߀K#FāD56t`P? UǼv3"+E)+0|ctͼC]cM~OYa嫽($(iGK>l1EI+0p Luo|r?|j, "PIhMϓ)&.FBpx(7@IA6,y2\q^s.sC2rIsoܠCu]ǒ:5xO-tiUq^nݞS5 Eg#Ml"nM \Tߞ'Xg|IS?Poѷk(0r$Bxk)E:Ub Iq/g "`H!PUi)7ie_=[fK7u( e?bxϊn\Bgq"ă֝:3m $\OcU=D /Ec(@y7حfS(u Ъ ]=B^ N(` `kEZ5YfevL 2+/^p)3C933ǸKz"*J&Vl>vɮiFw\qR͐V[qc =cٍO<'ĩ nt[Z#o-j%6}qwnא8D`-p\ko"$/y7a)UDH}B%w/3ϞGGFJI;XtFGZ n>`s?Tۥz@~726PRk8:͚ AWEAf㊢ErY GY..20J?ITlOxw5D vIcmsef &< f{wS(G\;3"P]$Ѳ)ڡ|?J]545RK  48JmepU[i"Ǡ-sIF|3u O: GίEz1أp< )ÜSXC\}a\.epr=+ӗ,ߝ31ᬗ[O m ~3Ol|޻ݢ" m 1IJ?8颤R'>)y}5ðx/  JR{+ڈM!9MbDnmw{( _֢ՀK9"S='=W$\gXZaY\O( 7Jrp59`*Taw|#'6ڽ$n {eQʲPn@ykqg̠~9,-A#Yp-qL3K;4@ހnnMɰ zBQHP8Gwflk$F_'7&MbH+0p?Rt"dW|\yя:>Sxm0:fcV} 튣pP-…iƟEP* JEH+0pK?6UAt{ c@h-u"In'(hM>gµuX- 7y|\Q4'46"@|&ۑvepql176\?՞s@@0& iFR"v"Zmkq] [| 4uDs(Xޮc={;SF1owС[B}\,_nOޟU|C˦`ZJmj9cҡ=ߑ͛+*ڋB­>z <ѣ՝$@ZS#yw nԵ]1f'f4lћ[篯EPmt}UJIϯWbEcIbw⅀.Qc)£ LS(uR2 #\NJ xCI;/'̺z~~r"?S/g8(FCå'~pNMr(CD(?P7&ymzrNppLJxeps>/8?KYWE!A3^6CR^WS[l?e6'v9yŭ:hS1/v!DRQ 'vPS™e<έ{dR2?C,`*:7LwoŤVq&a nX-"hN2ѵ]L[br2[׭.uη÷}㓈婒čxAS#1S]QSr1m;諭)z֛@} :PqԵ18BeܥeY\O( iGLdZ#G4r0/5.L:f'%H%R6.1eq=($(KƷ#n-0z>8mvMUƲ9NZaU< Hg?ۈL,{({<ϱܼ`3Y '&.IFu 3ˆKo>ox`X/HKa$e(PQ7 WLsyVKI,/vj8?ysSރ/idVU{QHP8cl%ro?u~m-@ wv[Bzo{C0 gE`H掤 Х}_-fde2д?/gŤRXaA˙,zeW0  "}1 4KGQDiťJXuy1b$O!;qXgAG!Ϭ> }d^텯 1t`$Fi=4ʄi9tO%IeB[ḡ8#D K,b m"WxX>5-e aoa?޾!k7ouuLe6ì|] L _Rwx4jgl,K(Z^y va3#"NWjr>h*ݡ~B!=n g}ToMI[uy-?gr3f-= [2bJ 6%&u4 Q ׭-s7mZa&Yi NjYhGf6IiNdxa7x|{j eq=($(x=1kgܾM}h:KWtOYمڽ9nN&ӷ4'#(lz^aI'DMgκZ~?h85+c;<&s(c033 g,xEgj9EXGeSSZgOzD@eXȗshCVƐ^IpMڔp-k&g@w#4kr?nE A_+L~2PQ}d@qGY@^'ю(})&7i  zBQHP Lu'IӾQڢ%.n5j쟲zڋMncp}w$y䏛; lꠔ-4Ж6"v\a:\GQ"̗_h]T֎Pޖ#i IEfs< 8a eq=($(w8A2DG-U[/ HYgiꨩ7F mҫFQuQ8;UqnpS{>sUi%_{ 01l2pSdòPp7$ucg}'t* ~75;׮( c#\7g|,v EeWYZ@s(Je}w署ZF/iCZ4;]-(B ևP3-Rf`JQȟ~ zBQHPݧwUEâ ]c##%\&eNOOrӒ3H ;PvU{8P3 \;q>jĽuCcU>㢵ӻ ˗+$i[Sњ DKjH!gT F 3h,Hrނ CІU@P0"uSnzI[RD'2r.*ƅ$ j8aUq^Ndrun܎\E܆?.iS2ݔFs KOE,n/*ݟ"P(/p,h6wl\47T8E(O~r5 K0, E!A rj0Df0 rhEhep=hƩ F_Og)[@ /-mg+%!&jUS1V!s? 1/ Ģv*o4Oêj/ '^ڴb 3~ ]v)PַܔlJҔnL.E0OZaY\O( ?ϟ|AATAA%:ڭK=<'ZXaY +eE }9B{J- ; /ۻ`d K#FUw@P0c&ZiI4KYfq^]Rܥ':rOTy$ 0T_$jd;hz!]rR]zZDOU1v> 4+O啡эt=zJtݧ犹[V̕TS[a>g\7ujc6SD Twcr]So[jU\}ekOW߉թWƃGZa嫽($(tց'Xp0m":uM<.cBֆkF`OEA- q| \fHdC*6>)6n CmaN3ы]iIr\,5jYx'x':E"Q]VКMzj%0GE KCHv _LFӟ#prL:m]TZnkڹ~| /PAK։(L11W9|/Z0pu*>kKIB51KaUq^ѣIը]mu[.D^%N3V,k^›ni+gq?zUKHTfou.oeclϡu1E(+8+tpQ ǿ#?TI?~{na)=UqOm\ꨋ% fʸ[q[mq,S#y.mBDLMWn1xwDSV`X懲 һUzȣCzS g.wVO0(6sͶ_Y kYYPhجl<]IK0,MzBQ"{7Jt>F(4bn +WEA¤1}Jc tQ'Q&k#VgrQ E:lv#ild62VM C4Z(mmT8}ju)r%QQ8u;!C D.>Zvb* Fu!zz>tIh|+<Ϡ8̣An&BƒɄ%p]__57 AEt M"Y)"@d?'%b0|+$L 87C,e&oM̀iy;Ziz!tp}uwr̠hm/eXoglS"e8|E]"<PL~ʪj/ uzE$:11Ϩ*ڋB9Oݢ2%ؿ8ɞzsE{kaUT^$l݋b !W4B31&gnY±7~So3~Ϩep㉩=MY_@u`'ZI?}{N8*0&j8um-j!SQ@P6q$z0LKy. grʗH;Nvv=x~qv絰êj/ cG=hS$f!Q]_NxI@v7Qבiv3^y2'KF"`:90E? 8Q󀷖lVSyQ@0ϰ ^!сB}b6èx.  >z6xc^Aռ+~RNm~ܣgam*,,'s7?#ίu<S3XaU\./h)=T#qRNj3F"%"'Kݐj?=ǡwƖSn񳓿fx Sy!kHXaY\O( ?6ϓrs>n'_??y{XĬo"@OE@x&gghFO YυOYaU\[(-Z3̞bļ]\µْիb eq=($(lA!;sn:m7>5BٕkqJ;߅aGChò8/ %$hoۯDMod 殊!u( k DC_7S>ZO;Me amp녯Ezvky~a/x3G-hT?I_*D6*遱k"7 ntKf{v ~W^ vDH.2sIlrIsoߤ%pD:oG,r<̣V`XWE!AYo>E7 |Sh|&O7 &3wc+QCs!q *⪽(a|C)Mrs4 ふ؜8ɪwP\@z~` c:-(E/i0FVJwR7YaY\O( <ٿ[4I$YF (G y(l oۜ:BZhb@]@Ds/qe)&wZUZ/gfQ?e]y0Xi<=y\t#HWM6]S2P8簭}Gɨ9θE87}`Xꋂ 2F2iha(etbE(M`E31~*ę $YFN.#lOUS(CGއ0K_YE(Zaކ4OFVs no8KH3$8 q&"PǨMxO{@o%$A 9(yF5uaf.2;`" # ! AWEAċp^_8MN $Ǵ;S,ɍ~QI$p_IC13Y3d ~fNQ8~c#L_9Zxcr9M`={F5DW(,, [%j,P evƽUk:xE)0T,Nڵ3{vO| .䞚C2PW'{| LqyDRXy]&iaF/yγYw?tMʼnʲ?0RWb&?h1MCqQ)`Eu]A=WRIQ[;r_tOYaU\s4~E@S/uGZaU\[L-e: U#CȧjTPp&7Cp\ts˷'g8W^]ՑHWepcM ߲ݚ, ݕ$vPqe?=oCS!3׶;d|s_ zw-<K0,]( (eht):p}~W˷C!ト0TT+$Rnʎ uiepcҀZw45u_>򇙥($7cqR"EaTNC^WC7y 6upcoY )s u}G?Ow,RG# aV.  $o%xJrCK8IK?(8&T *ڋB‰U1*>VuXlL#KnZaN4:`Wxa^~'ޠ4L>\+;ran<H+0 a>&&p1epcViGшSWpyXY\d~'!p`je ah?و<d}h3fD(XbCnwt|8vi?4ąH\}[LҞl^H{Maڃ8PɁA+*ڋB-ݏxuiڎT>=C8q!|^tTB=/%cj#OCLt}$ K0,}O( e {R|I֮_~~:sUY21Ɗikv؏<<(' &//9ne0)hIIT gpO?nUepς h $=f*$u{5jǨp=~-ua|єX~om8 $l8~t9Q 3*[; %/|+5FIHC)^0&a=8|)gј[p:d5 a5!A^6&189(2P8 ;CȤ4рwyO^W=356I(5O3=2P8sFQ$JQ?ڮepj9r)g[h5((4=(뭸Q-.fe(a.Q)`(2C֖MD3wEeq=($(&FHKg!aWGsጼ'|)kA`rf֤w#2{%F?lU{8PՁk_+  G$x;:1d59IXԲ w6'G_<)@<Ц)EM)<}n* {=G$^?ҵґ|Hw/2o o(}54eWIY/Nм8N#(1'kJs;])=vYhiUq^n,Й(>N)@C c KP<:;D#5Med9`Ne6a[/ywuJSovJr݂1Irԥ,'8|9=\@SW7Q 1ʲ $۹C/lwQk&}ci<6[Wga eq=($(\VlBQl+tO>*^>k/?D iz;ՏnmMi')NYIVU{QHPZ:3Ӥ|"[fZݎDIނs@[u2 l7~(j/󵖁=3Q(aK_T ubD҃Ln*i6*BiDhk|MxTTĠq<}"gEU:x3$?xLRFg8P!: ܎]`F/:Yg&^hyiF{`}N$ۮ4x*FBe̺;OòP@0W -V) 'uoN4}A)+0pr:877 a"ik$idܢ n/#`h)=Mi'u\,t=( H:| n N3itoiiYfӦ<ØHG@>S ǝ?ǞߔUETgH(oջZ,V<]H/"aFr^3 O5HW.- #@rԃ%b'|b@\/ݐ"T|YB58ݑ;aTЙ-@[ZDxY>?RAk׌MwU&0LwE@~a>W%Vb8j7C\,^u6Yw~y۱FY-R~hEէ_d#ʲPykZȏBWv4{ ySF/U[ =wd>o1nyg~4օVU{QHP8OCj|6pyy#*ڋB-CαDadt$Q ldܺ }rdi`s{dheòPn@_\mxE',}b[Ԛe,Dcto-6fL:)"'`={n mY0r]L>Ro[/W)F};(MɻZ웋WW:oS2;ЮSt|^O:DšCx=9(2P8²ȺzMumq\1Q GA,FZIʳdHؘrT3[K2Y, N ؏s]rݮV5B;^D’YOCXaY\O( 'e(ßI%-VS悔Xwy) m0(׀e(>d,[2C2#DM@&4,dv緯6q,ge調(0=; &|d.|y )!TZaU\Se]h41-eptρ.\j95Zoa2ʢnM]tU[Y w&uHӅ،!`Y GVō4ŞwԘ#-ĝ#Pqܑwwjk~CB1A"C]+B0bG'^@h:#-=($(o4ݰr4xNOf|cژYDrcgY,"p uCl0A8F`ןUWG TO'~iw![kB Ԛwzaɧ0r|6R[zwvzNŸK_SGX}f-&Im'!܂ ߸%}To )CQJ`ϙ 248>7d* e9fkT[ } ߰[<אY@JqH!_q+Pu(ί)0tzC k wY=(JYQ`p-1?5P2nWw4u1KvnJcORnV`XWE!A=%Hlp(EXvZ'0G2Jk_٩1$}OxY1r~ JȜqp@}\|m5݉-#&P^O6" OnߖG$*ڋB-5'7\"SDwQ ig7|q^7FS紘aV.  |ړbֵqo03TҖʹ$8}:"5흗"P/A:_ a(C']x󬬭e3ݥ])-`[_3y-Sh9ZteGY@xjtQDe<.d@g<ҳHu ^q #^ѵ2P88`:M)F+w!NU|N^/[<}D۾z@tKuxsv':Ԯcepİe=1{%nclQstkCS(]_w5B=G>A:@wHEj3ڼz7µMر%h+q7:G x9 C0 `"y9h1%mKRgM#SV/d3ߕ;m Zαv1Mj;62êj/ Eg3-eqM*:QA?eڨ. &]R7CV ܑrx.xqw)`LN\ ⪽($(Y!uhU Z"g2(Hǹ+eŒ36-)7wn'HMZhM(+2Xw+\qo,X.7!6,2vXj ⪽($(YUƤ,5%fj}]L^c8Z)2]<~Vw٫ 1J׶)$b $/.a4%24;y2{jh0z/FʤADָI#p.NHC3]|>,wv\a>9'2si˯[H-1u 5zBu<6m"qP?)4H{,epc`"Lsf 4VvsK/cϕst8@ oy;BZ@5} N|Rs'-?e(oO>oL< ;vS{8PӤ"/C۟Hۧ{ȿA!^R遑XOxSZ G}e߉ՒVآCe-?.բj:Q+⪿H tʈr_2"1裥坓xT ꃸ^UCy12lOosAX#Yf*<ۮgm調(ML~dIuifgٺA\Q<)zX,eCE).FI 3犌uԒBUx0VӍc! 0,-='bȾ!Z=yc"n.C~3±7| ˇ7MoŽƟCqdVG  Lo7~绿rB' fǛ@I{"tJKwJy.;L}A- E!AJwThS!ZBتZ\KW{QHP8p6K$r="I89 #(x`XB­.z L' :;mdJ>%pWV/DeG#$VX K0, &˙6q 6I05 n]Pĭepf^$0ƩQH\gòxP$L-GY {Dk{0 UJaul 0r% Yi?FɉL:I1fUW(zUK(K_zs-ʑD=8{瀜H⩺(1](*KbV'Y6qFv"DpV4epcl'¡DP8tS(xZHqO᧐ep;;J1 ='Н(+ GXacLOh$Ť+*ڋB­3qkQVw/_^yc |pòPn<^_=DOz߼ޖP8 󚐩3Ŷ9(O/vOx7,KAV:ƝJ][WY?G&mm:.|ˊx{]y>'~&sqd(\sPbFop?j* nƒJΜ*<, {U[p*{'?*[W$oTĭFw8Z8 \9&i[)C2ͬv!3V-T{3H0uo! }wtsQ0J qnu6{*Vo{=5s qn=j k6vcx1;vş|-$}Nna%81b8g#pZf``(\WqA LP'qۤ:Yc"7 [wK{yoFތHQP AtSv`Zq`PŦ所pU[$8V-T{3H0ro c$1brT'Bi> 6!m,l'4D=u]DycC@K2Xi غcM]K$ˑȹ1BZV f@ZdZ̋tQ']hl܂24d~}a DA{E>Ic;}4NqDzxFEK 2K$/;!8-R3@005h J)ɔyu폧ipjw5.0-qfq8.*a5F.)\6 b<3Pļ+7֋UH?wv)8}Kv˚)plua67[m=f-s| eba0td+e9 -1lg\5V+Ss3ErMe`po..dΠ`ۖ#3gu- E]+hԃ'jxNn-Q>C%j*N.cla,ADZ䘓uwMe`pi(K OIRFԖ_aW `;3R]FT;xsOL%$p_FH/7A^w$a xIOe1Hh=^Eg|2]gi)me &zq(]y)xXz4/B$S@Dz  n_KmCƣ7=%_dZfog@xvYK OP'zivtkPǪjo gN( DqY!pqBl*M(e2_TRˢ!x+}>{AIeMVzB3H0ab]p]s4W}4*aYJU>xLcu鉗{D]:E!]WjڛA!Áis:?Foxv/f_~^4Xehx~z%8-fa>ZwTlb{H-7 $Ö,~Е&-s)΅w)Iv)EDz  N" G!QWkhWA?qbY3q;ޑߓfqzB3H08*-uWyM ajUvz;sdy.ԁ:*tus 0 < {vR_2*y)8FM(TeacVX21b 4م{=;!!<ڜ˯e`p2~Gظ/ t︚Hy^O^{*3ISy%8-f`p]V־a"J,0MTc1V_9R{ԓc%4^8x:>ݏjomΥgE%cNe`pca@MO3L3jÉqD~ 8^!!#FioGד.ixuTT'ؚxoj\$;] >/b@ gxڔ PMt7c,χ[x7ϗh.Qng Re`phEމu AUT^{ޛwgsShKZLlv/h{5⫨T6^ zB3H0u8>e9D. S}߼'ٙZ|K\&CD@썢 0swzbZ9Ҿ ?Ȕ c *$*gRMr,swcnua3׎9=-M4,'i .#T-gRXp5w/MS=Ӹ@ .Ǵ(Kp,[ EЁOZhڧ-KxTVYȗR|N,ʃ 2HNP,~ſt` VEpl|sS%l6/蛹 w~L<;*sh |qJݩ ݍquUj"/}'4b<^h nrx,},TYi,LeaAW3;$i|Ne>_|wu 1~1}`\``o* 1Oh釠gR}u)T`X9Q~J[<5[:n%^Vӈ!Te4IӭN$㟧EyrZY{yqX*e =$j|C%1~ q_v208n޾7Cp9>A.0tLF[cBOh Q&G 0x- jڛA-mi]tH9ZA遜\Ӓ<~T+5f_24=-\u׀YzA Sg<,t/AO:켶G~*҉ٗy208nb̛ъt`24)%^6W9o)&0G$see#1V_Dx9aN&y6 cpf20w1+qT؄sDWgQ;TS>Dz  Nɴ8u6WS䐠|lP ي i3uv'ϝܕ-!!\97,,"UJXJV%e\N,[Igw9/$ 4ԣy0QɎ+̱̿LcX]  *ɕ«(]!s蚁4<=F/ $\7:{``l0V/tC!6._¤J\vѨg]ڡ_MZ޶,-+PdjC:N  ߾B׽sxwrMs=|gTO^SGO;?P=fU)0|C"HDio:NFJ9"b G}Oĺoŀɍ\hղ _Y5i>g'Dw۳Y% ڹ_ٵ Nta#"’*x.H.lϋ:Aj e =$ܰKu\}i3#1  K7?O|Պn 1^}r<I&=FH%=ӗLٙR2ߜg\4s 'x$Ζ]è;W*vݽqt|}?!Q2զ̛dK11Ve_aɁɌ"+TNҀ.<bƦjn z-FLgoZ 揩 \o֔h$Jd IIUYcBOh Yv ǒ %z Lv1N_#pZf``17!uG]+gt'| Cz 4lUG PF]mRͿ nnv'* ?B;,/=.'&qb3RwEi|/|̖{dhTRBeU,u(L}Uw<-w}$EA*y7Umi1˃JWoOU:6a,c|^p'i;Nm(hƒa#9u- fLcXJy xڪN_O YE]Q3+;K2Xa5V-T{3H0ag OB;. W*V{3H0xrQ)f0[vl5c { Ns!kl2'ΐea(lt #EP*Lߋ?YtoTEBWd:+LuRb#>,67Q+{x'0פ!x$%^WU>~kO*YD D SIc"7[ #r Q4Y97jwE5kV5~a xIQA@ÆQ*]y҃t#4z96d|u}>H%/3'm@Z+=-e2f`p%"{úUh09[RpyfY9l˜5e`pDU?@u&c΁i/x.| cB<\}m)$ɨ+*&&AW'p]+L埉6PPÔ ABJQWH)t}8 !]Fu-7I+*pS/ѩ|!G6Mb6ҿQ 4 lSuM}yɿξe`pd5;;:޽pD-=$Íd|8bN1Kň,SLzL=tеGf#1yNKŕ'c4[7xDdŎqH8Fi 5=֜\JF^g.]콟g$l4 [,&9[翆42WGKK}#z?( [``N~֥k8 ޳}OaSVX@@V\NDR_N 2~201qK7߲hN S\ =ß2g[3w.S݅Jۀ%Qq_P2JRc;ח!U5lͣSi`ρlskx? |@DG"4jq5[RC"я)KpW ~mm(wdyvțPYO  zn²nL*ԓ]/c֨nvOW@R3*RY{뙲ۧ208>DaӘ{Hq}meu*#+F'׃OWY˾(/tsp{No7xjC$PdҦ2OV8TV{RweJ[!1$a!bΩw@ 4ߴ9#V}RԖXAwѼ,8ܢDJV=chLj+QRWy,V]pq)q^ZX-vrx.q,?m[aq.7߽g \]nz??4Eȕe{ K rE \3$rD :pJ%c\~ߊɥj_6UO7ʥRIӇOG%!S(9Lxe e =$8(~o{yBMeagoϸWL\s" 4L ]VbR>P.)M wזXuҷ3 *ʴ B %6UYcF,ʛO?z(3o"5s:71i%Gi $LV sBԙ#" n?dYe,myRVR<5+r3*s!Y,m,l'4M&K("^`* jjwq.U  ,w.L}(HMTe`pû A[[2fߘO"d [qhS-}˙j3,տdM_D< "0Oi~\L﹨'E/{6g7flʽ-SE>߱: m4)~&)#ք:* ͟ W ܌o}Ɏ#xώ)/S5l--tr8˽|Vv(L8FeųmPW TRHT={pϗR}ȹg~+f-o-WG)[5~;ywO 8ߎ9Yۏ"03gvnDνIeHΘ;HU`UyV!,@3`;xH.70w*@(0:aOƯ':{H(Yq$GhIx=LJmYNHT?0Q̧Jg}ϵ&ym e =$JVLm\r%8'4K6\i+*mchz^|?02@wNea|PEL#|O\d b葅-NVUSfZ7*U~썵~5f_{(㨒kHkH.&'ӟFYcBOh  pr'iY}(SRtjqNCXiRNXe-H5lМe>\w}V?P<%<z[]-^jܩ n/yG@x"w;hs}T'F4(Wo=sPh%"F$ aqQvF} !1U52:[fR8Gu?sKFqLg_vOp gmeWmSF/BV4٘*( 5bdzY"Hq}xi/HKo⮕%8-f`pA]|^YNKI3%7lT9K $2`lw39:ahFh9fhC3zIxF[c{B3H_mrlL3To/h),'BM8-XN;x+ލ-e`p9ӧ/x̅/\P:@Q13aC PMtKw axx_(*O,ݪ`-ϦE2lr`g܇ZUrdxeV 9dyJ陕!8-P}38ШuC`n=Hs?ޅ[1::r8Y~A_0ntLwh-`+ cD0 Ǭ|7ryXy 1  lHѼ?E'ckTe`pj"]6b0kaywT]xy?A iWv3$%`EGtYz[+2wv޺B&H8}ynh}z-'R4p년k^*{eeG208Zr sJw$ nD冨C" M+==gn2pyǑ"T'E?[Pb-ZwIE ~l"&Z,M'ҞTF6'(`ە9YapYR+#Qٽēpd]* oK| ttʝ/=W V-=W BEׅS8ʤ HM@F/ϡ@ќ3ttD%T茕h)OE{PReJاDc1f9T48V-T{3H08YzEnwg!$" hة{7+v*#pZfpQJګ2_>fܜ\8Z"J_"xR3Vg\4&(҃=&f6Y-85it%]p<5!fF-Tw@0K\Lڥ4ěD!m$RDܗ  h:= +{:1aEge!H'208y` coU}MOsgvwS hZ>1V_OpߦD%Dw>v 4qi }ǽ<^xSf= 4)XAO;6)/1aiMnWkٲL8(CQYvA}!Xi }<龎U*+Ѡ k ;B\q.Z`ķQ7rTVy-?Q|?FDH5)+t`9mhS-'JݥnU8Ij=vC2[=|\3csn{'Qt܃X0Z(~!ǵlt+Y~ޏ=;{YD$%Zf.~7R+4<Ψ1ں }&`qgEʽdkzͼw:Ugqc{{nS^+/Wǁ'W3g(ZbxZa[H "H6}7f^ߘ^]SQuD qw63a3OK8v-P{380(5F̮37.t[&bQϔw|*6-Pq0 *1et\_ j܃Ʀ790}شүt;BGgۃu #&XNI̛_\V^U'qDWxuHUYy ǵ` +0*?g8^ %=$:;\ҝ+r- y}ɗ[412>f͊Q޶@7vn4p; $ͨۑهR=+ޫ Q4AO~LGl+_loH2ǰEo~c<w%ۭ)O$|g*{?NJqWQ |//N91%sekq.gd]2?7{it2{~T7*Okp@c$yF%J]%.3+֮|ouV֖XAsTO8cܰZh${~U0LԄ{WǜPUiPLWSW25n)@˥x5D$?cAKL}~͂ŒHI/Av,DuΖXA-EW ziUMc'<(w;ƸQ6-* caıpȨĀ8$7y>3xh_q-a2^MHY4IgL`%8-f`p\^@[R1ը7Ƚ|7D2<{^2t9l|<.Y 8Vw`OT)c9 z).܍)Ǫjo ~3p'#ݧ&$[LUCb>1Q#;u Uub{3d_ |*{u8|B#Z2?6e`pyYw`15r}J "殢G7x->ZTߦs@z*tTFl襕(_"Opa_<_UԄ"\%yY#3Ҟ C /cB~k208u{^]ϫS=_F H}?&o!8-P}38ШXxA5[>7F'v$ jڛAQ—S"Uߑ2޼=_ L>WljTUO6YzV Js{3WۮBBLA-rLV]nAF` 3v vH%0VڛA}=솙4ܷt`Q)8%퓒!8heQ  l"8 XI,UI;20823)=֭ʧHX8`Lɬ@4¾Q7 `Δ]Bc^v|8Vʛ gO_uTI (O*j`W4 ҕ ګ  #PY晲Ocnqj~P!gBne`pJ c>g9CʩO ~kZ__FU11O&0*}-AGҢ.хZ> G" T|Q$H)b L)5A|e]ezB3H0m5  5d/kO9p/t|U_\EyUwax_UUd ߲e2rRY|0{퉩8?oN:pxvuWj9xBIȞđYbhYe|,H⌮H02(Xi ooKRVމ_bEMX}I]y0B ݍsW^XgX0FbO盦Vxϭj?kn &467lyM6'3Kf݂Ӈ7+(ʱ)ن:؛B;Uh#pZfpQwUdjq|qx*]0uK4pgdS=K ,p{u&.1:c%'Pp?;R?{q$d 4/}G3؈/mÒ2wl֮*oO"#2q9!Y8V-T{3H0eK ɨN)YlTft@"m_2:]03?3ؼ~b?r%wYq.bgwigjڛAdO{=8 Ne'儾)x{aOorphS*{"q#UٷfV0/ I?*/+DTcM5#k?B)F_ղ_%j/{_2@>k&fI}1F"20aUddw>q*4#> q뉳|@yN~(|]nԅxZV^2U 7񢟚`AShU-M𴩢%p):Bt\\U"Y?p =?Go>GKK|Db$B $#$6iMi>cg _`208zO"3;3 8H ;< XUgE54N/I"C"IO@95SWb%%7F>y0Ml4袒>2]2k"U7 Mʭ@)V_]][[cB7S'0(cr'G'pQe`pڹX$&DY2I+@ >QMXxc1^9zGe`plehHX{ID&uZMpTn~hڗT+H<:  #3?h&`LabB f*tkETFtixO"[SќEq[2$~9{FzĂ 1t",¹OHq5U@+u6@ch8Vg/T '#N@C{D,l'4V Ixw~ 9q]4GRe(h+pb7[:*Qͦ5_+3or rlf+e`o'-^0Pa0:Hoؘq%8͙ nXϬmX7Y"e`po۷k2MsԸ]c=iR+sꄉ IZjݻ/B'>{zb[۩ n#-<~[k*G6/ca+LT]gڊylv o/2|Se`p"Td[t_Et_K:x n:4~#nIۀ jYb$ #atɑܱdp)XGTS UH}ogD:2wc"F/&K@; O4|n<W[cB7AASq 1>  u ƿl`R3h>e8V-T{3H0gYqkPQB:%t˹\=zjU  n=rKc˒~q} ;K{? Ơw)Me`pizN%׷OlFbDtx-,м%u xVQKux3}xrh&Kp#Oh 4A(Pu!͹ti},7;k>Ei$6f;Ghᖛ#MkC-T@0069(d-th|0pm32f`p@B^AƊPu~uU~rk)`A<DaY#iE)6 \m'loE'sZWO5rZzB3H08<ςB*͸&?_Oj 20!MwiCb@;2mۭ/[TeN M{׽:K*w У!r[Dsۺ Nv|o/9UhlJ$(ݔ%8-f`ph"p, ji#]bkTz~Z}}ƈh# %K>+\=E除:i'GhS={ӽ8"G$ q4qK8FcT $:rD7QI*NNƘ)XtQzcf*볇fAȑ4Jk3q.S8+c N nJr&Ygշ Nv7>r|6< ѾnKL\M8pw-l'4SR ),f.qasH.­S ) .xAQ)HcV<돓T)x>`REzNޒ-?- = hKx s'jBxǤ~aGD;6E $N@ Mr)K&ש~Oqn*/3sr~߫1i?F ^>ƻI3 5-*f?LZq˰80Y,D4~G ^ ع(ni<%8'4[}P'mK.(8y3Lg\х=r™X%9A yPNg3])A,=]cXO`tt*^o/<(2|eK"/DFڪzB3H0uyEhv/} OZR.IЕTͪka&ZZ_(@5aLC}M흓s\HLI.G.k^buhX^GS4LTXBl[o"~ J,^ i7X!NdZ:9+w!ԖXA-C.OD$3/*CDޅ$Fş`r"aoh`o;mW4_pXaǺ0. ʖ€g1&m"76URJy]j^ķ(q66`m"7  GT;~y(흤WZ2ywE-kLKߢ+:_d\^|T78\\ l+Vea"ʫ^%y ECw]t|jk;~[ƒ"EP?EH B"^ D*7/SVw'{I6 }0_ 2аPCr6 675.뿲CpcWmg$D!`ׅ5DgRe`puӌ A2 *٪tYM$JP{gWv`Zand⬽+SaE(BB5~U??Fjz9Ϊ˳~{*#?B&|Hm썕AmTmR pLz~d]Ǎ}lk ǃ1FAed; 'wіXAp|n t_;|)$$v@Dש20R;6'qɋSt620IJ.Bu?h~eaè\E3}0"cvc 5Õ 22)B;'))b(w[O@ӵ\]5٠+-'EoS6YqK i>uÝvwiD qXE|Bc{JReļ{;!j\e`pWq^uܣylOЀߓH! 9m }F"O#4n] Gc`IUMQ&Q8zlޙ@D(E{4*V|jYP6Ya52pOy3N|ǽm'3\Qt| +n+ `8LJUTәS llACUN|cTJei/5e,+{'um3Uz_n=e!ҷ&3y6);_:EJPe`pc.=_IGJג\ .c+|K8mӤSXƞ  6g-,ynn9lVE`P2`).}4\" 2'K >=$w*iy"Р7`q5#FfmU9FPp|%/vEi3LL ?pslb8nCwωztGN޷o~/R'u"Dp"ߏ20=ژ w0YҰO|xcftRXY}I >{[}4 j4cW!hf|9wZ`"c`Q[U@H˸ \]wp5õv6^/,YX[D xlgNd.z).z!QT UsJ fjU&<҆hhLZfl-+)cЁgs#d Vrd>߈rB讕8V-T{3H08YNV{ku?4}8VڛAђ !E1λ3]cW$~>zjڛASxY[LC0.r]:_ڽ nU쮽Z6MuMe`p/O$Ʀ8q. 7rM!B /(&>Yk{B3H08mv,yP#3vBx%r20qe |.ܥk-o`rbL4IvxE^NU7:w.&1N 4KoejowV`߉3}:@32r"ǮNӘEAN׺ ,_d41Z ԉ{,l'4[&17! ULPn2펩 )c:xyU&FcFFƼF N}^m+YiZvTs}~Eg榐z.:&Kp,]UfrX\qnApW6U۞`#_72Dq6tRʒxo0%8-fa [UuI[#Sz4V-Ry3@а*Sggw |]ۄ.,,{a]' \&X6B/iGfeWRN?$J ])RI%8-fajN:sQUF.3ԍby%]7[[c2u e`pW$w!y}v=qtMQ/zc"7[4煮hw,e_)P3=;Dz3M\ѱ.DJqe k |>P<,>o{ ytBSl{r%I?w72ًJk{B3H0u|֏>xe;vGeoX#pKJ&ng]S^#NIZiOM" 7jq|ZP{ Lq"TRSB2[1eXylQy(8ν@L'([wVXP ZP>ejiCKD8lюzX$'|]$ ϗtCRbLcEGiVe`pWyA}.*I1Re~,iPJ*y[KR%j~f0Z@Æ?Ѯ$tO;ŀmLoH{V]'/b A-̿ mv/ o~FۤK"M7 D%Ev'҇ n<]>ģ7)Ӑea_xV; 93329f3y HM@JG58ɹ$U١Fnƍ}kmlJǘj>(YX? + \G*@vD׷@*pig[R|v*,eXZʃZ?F.wYFGr?/:s`~ˌX1jF^;  :۫ 徟SΗZ)0>1%-';SP*OhuOIՑT(R?#vwzw^PMFS}$jIPEd<*V{3H0ul|=Kg#lh\e`p<3__å='bH 8ey"8t}!Gu IHoܵAIsd\5ʸ:Z)q2OKOgjs+s3ﻼ1KRNOP7%i1ijۊ.RlB]cSS1O!cil:NvHeO)n*\EI} & gE:1+]?qXYcBOhM丙0~Z[b$7tu2085 qp 32QQ&#p ηfk5B~]PP|ޛT\*_cw*vу2аȷ/;|Sp׺ϵ)'Kp,cOh ?wQk3LN/@Q7M~;ue.VBq~W)==7(XnYX0X~IuQ&FSSE_U'4.Z)G#؅20B៞G ƖF`u'%j,EMDON9,^[ X~5FgdXtlގ!}.Vk&n[TEmT QY;f2kihԺNXs 8/v4$mD*t7 ipזXA!R$vmN!- {Vuۯu a4XHYx Q8Ezm $MNَ.J1 A@[cB7f8@D89qHUI#}9bhu|OǴNe`pt9xr]=90DԥT ߈<[¤DkrCA-|)$8.eؒCZС^obLC`)k_3iy*R~go{dq@Ms5]&nI$208Y8::j?20cަ7:]f MW1mh\gי7QHn:tY9Q=y/'악.;76PB *.Ѯ@ C1ƸL* 6AA+Cp [f``]7Ws xߵGcc*Ye U5FQx4r ؓlX]+I6Sӿko]FFn$jϒҔLJ'˓R0SY߹"?i4I?dd<(h+[F`Z``hF?=wWQoN6o\I\$o5(PwNv=i*42#Qhh 4^ux"j| +e~r3.y'Ⱥ;ti^*%:f1_eکs^Xb{{Ċ;\&VKQŧE(Pϣ4P oe֓5TϽh1WNg|b -<ϏW#4R{ "5XX*DfBHLmycg 8*:!}?d*̐ӍmSA\@xsU>jזƁi:W.$~[zfr!ti6?y,+̶d6Y-'׷)208YC.5"R.l+sɐe`p=Ogۍ?!YShx%J7R7R0!wׁ_@Q99Mψ>Unt%e &a&uxQ'H8T7_uԅiz+[T珘jz2k)27^ı=ɐN|hN5dMۗo.Lxx #B>Q6+!\ٿo[7NՇHDB?aU/@vzʱ>gOr鳔 d@iot\^"5r \xFX|F+6ZFUSjjhNe2>}#$+߅JwޣXQzos^ى2R&@@ r8|Uo!0 yy9p]zdUf`pYoVT  Nǽ>KG<79 N/kōU4Z\#ٺVҁΊlLܥs'3U8~AG?*'~pU|6sg4B=GKq!KEZ DtuB No>\ 0}{ h\뢛lY]w300 #ᤑ|M6ٹ#C:bҷ } ߓ3)$IPڊ!8--c'N'f4vwe`pݱv-?vLfCTLf%(Cwd-rD62l"s<9h+pZf`p1rF Z'1Gp:ǫM  J-Z췥6B;Z'?cRjڛA+?E\U$.wDff9'_H캶Ǫjo 8*OZ]D0/fL Ȍ9I˗ʿ 87NU6* ]_`%ˍ$(GL&vȏ;Ue`plvN?N8>pr n끎g]%=+yB"N5rn|~%L)]ٹ[,>=$f°4O,;7\xWaɋN /A݁ڣaٶX {T/%ybuN k֨nfgyZY4R!AAF}-m+yI8T2Fuu=?"u8d_ 0&y"v<ǯ~_QC{eG6@tR} 臎9x^c"73z|P}{J@6̽ iOm=s{1v J2ԷCUU7t^;@ v EKlhs  tW3 _UzŶ>oKyf`9y .m4",]~i4&M#Fbt^Z(" Z4?ȟ鲬쨱ʎj$sӉt424"0g_MOpSN;)SNjx-=AU T#OR'ݹϓgWZgǏxBܶ/%OWg.Nк=q x3mUgRj%ӄ}vv^;Pz{(jص; "LL_VXP ഷY0Xy35vbQ10,n}~8V-T{3H0u"}03ip- (w{3eEo%/H.ѐcF1$5L}IY<:(6F20elT K0 =qo{뎯E>8`Djr ?QUAgg4m e ֎ E:I |p-e>5e,G40D2аQ"Qwc6[ w.Mos/i/'aJ‰ʖ.a[F6ÕOd܉kD\VzM*GX%rguSB͓zXafEyȺ#~kj F @7Rw~_L)h{d¡ZYxnyXHM@C그gh:Z8#400ZoG(fmr+ +{sFe$0f쓾 OV Ojw'y79($[u i T?@-]ZX~ ˡ}4tf|ff3+cQF\jfǯ6mBuD&NSI»9&mmU+RS{mUf`pN!p`+BaL;r?PeM[|?@ztfe(0^oOA54 L;u*!j.e  NMi|=|UVJBKAb2/oOz/R'*cVRJ4m'L-i l(M6*`p‹=G[FrXg^yQ+܂208휴-QT(6<%a2VT)W i־w:B o@&[͋.,"/Y R[)>g:e.eH,(WWg\<[!;<ܷ[tK®q@"d^z"'CWN8yB2Nd.>3]GOLo?0x;uxݯUܰXQTYNKwTAXȯ*cOl;/w~NζAdb]b$taRØ˼ٶCyĽQ_23цȲ,p#tDML,CYHs&=uǪE*o,Nf9ySًe20ϲy+~ĸ= x{q< X9$>uL({31!"Rv/AN9r<]N#F Kr:8$3wNL4eKFd8)\oF4-}?nBuǽ>޳lM-<+8~Ԫ#$DXvL#Y'w3oQ߬ _0={6CZCI ϶3Y2Pf4FE6d]6HST')MXYӖ6ղ !X<KR<N' ɍd绸۴I2"979QfK&:L0D:T`HW E!AL4SgNy&E(\W9;g}-"1@yc ߵ-oהxFu&&U"2P.j]]Ѣ{2P8Uol|3sRgHPJ4&| gd#:Ϥ0e(X kJ!KvFe`G6LB!'iPt)|Z)|J3}cz拉YU90*IU{"$2J6ߒOxߵU+Գs-4*;grj8SH~&n`epE.ڃFξ-@Ʋ;-%H7.ıdDƝc)ie5}D.V nQT:cG.5{:ir>Σ^gd(=b)s(5gbœ@ڙzO8[3ΗsͰ8v&O N4Ilߎڟub-0>`7m:REQ g'>/G *htOio)"cVj"P(;S3{tT%Ư” 9:M(R j($(2|KEvxzwn-[ ٷzxcJ 7-E|H=`N-qdH#Өh⪻H (c289Iqr:r4^h|pŹ+lWw R 7 .Ove PҸ\/Ih4d0MꩧpB}oG [$^|'RvgPepY, p"Y<`iuSx7U5rm7,:T*d¸c-QJ!U\_QOeu2' 2qg=4o|ŪCx*/ Z0ʑ8`f S(WtlW;ەnMhyfCZ( }k$N iL)Rq2R)/i>Ѹ]mܺ(>_4b.ۻv״ 䪵Vo~:dMm\0f6KY'%,B­;waA&Ad'T%(o) BF/@r[Ji,c}e-Xj:F4*)zdҁ"V(#Eqk|i6d(\_ij)Rx!ٌz_X>NHICD)VOZOܖi%u)X޾XpX5|,+?fZg\}ȳ2NYݧ2P8jkۤ4.s3Y7;x1"iaz. (⪹(t_ҭCbѧ+&urŠN-`CK?^vKKc\?il|h CNmO;tt5j)N@& "Z. eJE 3SZʑ$^ıD&ȕukvey^Ht<\9gM.@D\nD&GKl3PBȔkU]mMtqFrsn'}eS/(ǭu3ܽX+,rw×6z2JCiŹ %G璀GLH}ҺQNW#d?P|*R ⩼( Huפ$=2OGvƪ lFƖ]e(7̬|auciN' t.vd^*ڋBٗ,]?+(Ժ}W^qs5[bxŠLYgZniũSR˟ hR/9䲡UEYXv_rU^$l]!BnQ90wywep<|a"|MV辚nˠT1d/vnO V6hq͞^:["xjH%rԃrv)QfP{vAmff^$cVC1fepٳzX:LG<(0vkr`HW E!mup qݞ(@/`d{G_8(@/%|pkxY^M{>Ab[gدUP V%庲tUļW+2|X)??j_=<[c9r08Ǵ\t#.Li^0#*ѲvbH 7ޟlϺMJR^ΡVhʱP8Kv*SSlN тI)p-W-NC`R?/y@GrrGQ<RU{QHPS1ff#g^Kڭ'qHWC_~ޯ/C'J>ӡqRU{QHP&RWurm1ݸ`K~UO z8A.bVMjJar2\m6%͆sKep41z?;$|G! i?^_X{~AepOdԩ:)@&BwܗSA`ږ m -Gі !KS }$s>F7 !䪻( >8"Lee1eۈ5=,\E6)J5XQ N}ݗ(_ 6rί[:k')))nwΓ{cq[tY:N=ZOqأWzy*{4!Uhg*@>WmK볕~O7,t" m$՟HuoѾrs99*}\#>Y=+vb!1աBm~>hn]A WEA䚔t/65w~8oԇ>cJjg=քxw'~|YBvf?(-c^坔CH.+/ \oVJ e`l?gN OvyӰ:V%-1 )qQif‹υ$BQHP8 WSSqTC(\RL,[?]{ YE>QǤa-qrcC|W_ VMS_tNS(04#388T \.D"EEm\̬AfWfv8ϛt {O8I ]oQ0P .x#Bݯ]ɱ>ۘ+&ӡna;o?%Tq^u#7߼պgrbkk)^1[;ާU՞xW n W?%TT^$L=\W/Gv}+mYw iR )ӱL^vRC#Bġz3|g7$ٸ`]0ځa^Ú)RYv[b]`' 57AV8A'cxv!Z. aJcOz* eE1رjܷɹqhsXa-W<ZmilD}}d vcr Ū[[` .Yxũ'CCZ( '/ru`t+_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ԫ#M6v;ȹi$sgmĵ*[mÀr5D]$1o!y"y95e #zwx$BQHP!3dm1U+jnZz ^>Ӣ{?#Q[ϔvJ@ƏM5M}ȨjxΫ%ߩߏ x?Џ d9Q}t4_<Xa1b]nU!WRA q}5~ɟCj/ q" ׋ܚK04${kGpbj,R ⪽($(cM;;sDWfRU{QHP?'QG1rp'hϓF!*-FF|o1!>-epv ϳB4H{=ԂtP-wYO7k&"rۙ\0b>#IQ5ywNګ$BQHP8DN,!Gڧ=G`\OiJ!T-ߘhrյG)H!Y\-[m$jW]'Qz=#y;Sg< B2P8FV5!2T2P8rZ]].i?vga~D-`GE@VvAa;joq:Í.o\P k'"%,B9&=yy?1+QI/[ 6%U\[K!g.C8 γ)́;x-i~XJ!Y\-[9Q5T&i@ ϱc*Fm'pUBZ u#/ՒL:rS\-W2d5EfЭ}gf0*gf-^q`d?~ [m# srⱏsp2Cyy hU0pfH3ֵp}q^n񣝮J‘]DcDݾMq`BjdelJyy- Z"nv:/t2i= KND4CZ( .{jZi:TnY;CJOE1 =u esCtV?C*L؂r_/+ `hcʀ1ՖMGlٷ_7d3Ɲ[$t3k>_0MatǎUs0) dqPN>Hq2pyHıH/*ʋ-{RYTJ]e1у!&^&b# S K(JMR]CZ 5:#YzNn.@P [\#cr{Arצ8kKE2G}gw':[SHXBIEi}Ը>y/[Xwۜ,B7ç)hXtGOq<4΍&t@lzW{A־ ϵw <-BVy ^ȅG@Mҡnk}Go+ZrԦ~]yt;1Cj/ מBH|& *W$#;q,ܩrRSyQ@<%葴F$~IYړ, \Dy#q+0- /HFo)sI{h} 'D~KY=$Z/xŵ /Uڑ7ڞ|n+oNˌ^"e// k6{֏ʖ2Pg. %8[n%ٻbw"iWQf\v'N?r1)EgZYy\vIy#G%Nr. u5Q'ej>x,;ߜK\⧦gRYfGO}rP0+VoWoW%y"WbBsJ !X<Ӫs?=\ 7wj:wϋ؃t9 A0=S< 971AP 8])WBUiBK)0p;:oHiގ@KiȐ3=BSwQ@P0`d*Eg$Hq[V!cQ3jmedӗ5昪ĉ"of|)BQuQ8(yDVߟ+7WЏˍꧤ];/gֽد SRoڽ7g'&6?$Y פ=qn"a>?epb>;uCX޴}.#z7է JвY?Mwz;G$qQ7QГo : VeOjLotZd^ [ |B jHǻN1.Sd n\/2GKo9n- hA_EA{My}8@ZSOQ}thwF<8QakR ]uQ0XA|/Or$ ɛ츧RڋBIz\}pRΉXSCr|x/E-sx#듞HO.8_ #ʩ,*K}o$eԢH7|N/:( 7Fzf#?:$~t8V`ViLk*s#=n$*|@IWE!A^tSX!!t6sGB"q QI3*F*?;icCj/ {/-ŝz(Q&DM& ~Q:j : `HW E!A26{O_' =Nj^@ WEA.4WL\e&9~y x$QA䉩v!M#P7U"6vU TMjg$o<ɦ-$^Uμm$ |핺8RU{QHPej}WcD=yZǴ* d4P$l5]E>ŀzҧq0N#Qݣ?Q"/i؉CJ!Y\-=Y.>02?c6ӣg(8(# [|71 dY=E~ο!M?kBɕ!J{OJ̔{HptDcޭ$BQHPuW.k"¨a1C/C ^r"#" pk`9GwieH#`W%؏ &%s:.y#S2u{ %Zo|KM'ˊ /aNuM%N0~_UǾ\1GHMBRs I)0pCjqRQa͂g$B>lxsb\ٸB,O(Ԙ+m# V-[5JW%b#>ؿٔLnjfT)XԽR.f8tZKwd f[Sy>pPJ|2$QQ8(59*5@,n} }z@F];/0ԶILe PJ{ބZ Gjd`9ɽdH)!# t5|QO3e&cRkKr]LRt=ߤ0L1]?Φ:H#zP??pG kǯ_*h4\+VFWZk^g``?mzg2(y.$^O$j B&tUk PI{sqnB j($(ܢZq?ڗw?Q ~6@t'=G؍dΓ#Wt]Z I0$ a;FLϺRi[p_Kx`Ʃ9FGaZ RIUf1qҥ;Iu5xyQJ!U\"yr@~J?D}P?زRH-њRU{QHP8WEzscvs:=ʞ||AH9yK#~цIw7Pep$]\.\(g6 ikћ~T&&M";W38oWNH =^+OC!U\5 ÿ>xavl#arvyOL!QR.)*C1C=x)箍}/(M"P!t,u1;J&\zuiD(ď"n=~ٻP_g͗U"`KO4Eߪ:oU͎*#BGG⥖ep`:6FGPZ=rRkN@#Ĭx]AOJzCCCҝF8sdKJs&3ٔ"6FiQ;fmt_Y!srrM6B j($(QO$Y0 r䷶8 !-us)TT^$l8X̓ڢ:A~V#nc;5sa\@YFO{ہND(h-?S|I\۰"Jï挹3{Ed(F8w`+_wڧep:9svJ.C6ֲ +]s5l *ae a,Tg:.lO )s|2Љ2P vC )?]:$"ݒ骩̼-壸SϩϜUA9齘g%zQREśAh⪻H (w>n)%P }R3/ߧה8bD(HIE-a.rC3Q59Zi>+E(cׯFANS@<&2! dqPYHps5'f ^JEltD1R ⪽($(4,@4J ⪽($(ܺhy.v_@VI;a ]q8 :; C?9ZbB6_wJ $PnISSmܛFs0q?(v/ @_)Ut\Λ^q6v!ps켴PK$Iμ32P8;)?νsɦ PbPRaPII0$ aCj(q bJ~S J 4ϞڋXzZ"O6bĊ<^ 14ގiL*Yu-Efy;Y.MjSE ]wQ0P {'!OIߵTI 8y:;"=LD7!q8[ "Lq\jUTKqҷWz#p evs9?㯕1{7 [nnADq>* dqPNwud/Xԯ)c2Lep|whBԭs埣~B8ݖNqzM\~R`T_$$jdMjd?E.L%#y88(, Esc_I0$p$0(kh&YfSbF =-fܬp1w?GQ 7:S;pϑZ9Ֆqw2EK0b_* dqPNoKMi^NK<\l;E ͺ>D.L1яHI0$p,%/ +H $\kJ'ǷCG%lϖUu-#w\ڮclqcp /)D9uKnJU i( HzrfDm9ax2q?mitsQ 'W6as:tc }*I0$p4?ܯ=GEd49GxKUxT6jZ3# ).>S^ɿz-NCu\&I0$]  [ `T{:ZJ,|AXkooH:fQn_"Ux~DnӬ'50BEHؘi*p&iy"P!TϺ$Ʈp$m) C☦6]1J\L t d4aq9A0`OO3t i4LJi@ZYoS %嘾R|$;fq4`,0LUk+McbcѳJ|V[ʌ]Ƿ<,==VEF RO& Ƕ*iz{BzU8y+:y-]Cj/ &?/:g(uP _B9 Z0i s FwB>"4ܻ[J!U\A0"ԜxzRlE9XJ!U\*UT%J#lѥF2')T\u |I { a;Ll{S֘,졂)rdS hVIf&}Ҙ?1758 hXBu/.]Z!p{]482P8R6:JHO /M7IbLr|}~@nz8c{eJcv]@z{ } ڻciOcRLHӨ|Q&9E\CYdAwvFϞu-usۂ/yhO?[ɔ3(뮧5=!Y @H]'5ZQ5Sf^zr.,Ԃ?epGi`0aZz+p3"P(iK<ځ)Р rClB j($(4W}.rUĖȯ?I - 2h<[4^(6Whӻ-}ZSHX^rb }12G>zNmGf˃IBQw.ʜz {ωzuؔGW tU_$$jRl|y+,CAtT Kh /Z~[Ź[h_.*q}`Ḿg΁~e aWa.!]O 6eS(ܐNbRq-3U,(`f~g*3u"G3j{HU{ꇊܫ?-R7I2+S-يa2PLC2T ;1QU1ep,u 3IC~," F'Bw`B ‬7fcMwy`HW E!AVLw %I:I&6G:)(+G/W>8)g+c 4mY ׺6 Įg C5D{,u6FRo}O`HZ( 'LIndXl2P8d';Q'2:t%Q 'Cw{2 5mSc9:\OMepBgm;H{%;Ak{=s'r+k*`_lHa 1QOPRڋB­kBy<'2;f,,ݶ"@ڜ8#8.vRhHGR%H%2< $BQHP81E̔?^D]w^ί1Ak]Yͯ^Ȁ)9/+S,z<\LJ#Wadzz2;<\iU\Uk)!}]RK",~"15tT 3NU ,+x 9ph 5L)tcT܋?AnR{oH.7>#)3&Qs VdJ;&VhGBI6Ѯn<͕h⪻H (cp(wVκC隺۩Cj/ XtJm]sN*:c:,g< lv"{7,] KSe alwjw]˩HYm;&κ#ٹ1C$tȅݛ h{30k%АyIu7k(X9CC?|IdLxVYh"@ WEA;AS7x\bs@lmFuQ ׊>yeUڪMdny",m$uA쎧Ct UEe{}&}=5OaM{Ms(c1R@g\ G_/Kk6?^Њ  2Mg {8x|R;&kI 1S-X\ s-WYIk$*Θg} Ef~T][W휧eWB ⪽($(2OTOx !&<}d(\g1oA2s.CQ 7>v%WN\{ Y_gGhI-%I@qw{z SQ@P0! !d5J۵,4u<NE#l~l d`}т@tPt<'RAiX&&*ڋB-""G EmIדEPk(~Hd%NLL*G3>%nMjJ; $,B©ɸ\$V\dͦl!l1b-6RT2+fZ@ؒ*bdG2PfZ+S{X,)UMX3}(K+AnE9;R7yl5,*ڋB­Ɗy~1N=֌1@Dݸ?һ:bxIȁs^$JkS7r@ ~VUκۢ(\yM ]ż Lz߶ _q܈'wtϙno Zl]qgRcLjyLQc aZё*6$BQHP8-9FfqhEOh":6&?Ot@ҌdAYSej/f]+N49S oݛ[`CZ@_ϳNm9VMx*I7!@Gs ,, S8ب%QT|Dg j-ψ٬]Sםos&"rZQ8(fxjJT"EMOIjԄ Q}Q8(9\[;NJ+̱quW\75eȿ=0@W7}qCO5,4=q{ M?RS(ܸ_"MWSR5f%J}0k3 =A/՛163H+ggc#q 4,rZ @ݕ/C }7Z@x[ii:Z 7Q:l;lک;2P9ob81L0׬h9#hcЛyMixZV*)u1>Aߋspr#'*ڋByD;J'Q 3]P0ڽ6⮼p*sge9cCn~Qþ/IZRx( }=VrPzG5*J ⪽($(I =m*iWUI!;ɵn3F%Cd&Dh7 uX-䪺HHY)OIvjcO07W )0|xSV 1̛^NuЗ-mCW{QHPU ɇ<\~24l|S.Ҭ3&> @qG24 %;"`F>dO Q}Q8qlz43s(1ƌh?D^(cq]bꏓ+RWJP2Aě'KTВAOb>FLH!Y\-{ۂf_dY،kV&6Gf&6[o%Ve~ .$@\FQ! ω|ip)SGQL|PxzN ۈpe am vէfdqP6=R)guՓz8>{E8IC=OsU?ɖ 4wr)x(Cl%%_ح0٭WjEۄiGP#@d yNcrwYLtofBē-;; 3\LeZvf %G|#v*-Y@ C=\*pOXqO[GZG6Q6)OTIQ $Ff19h -y5P422Cµ>w.c=9#Dj6"P1GqMݬEBXkko^2E=ʧ(OkIw~˟^w hA+H 98!D]RX&:8K}:Ʌ,8HltZt>YAIW E!A<#\4q]wO ٞHM&|ۃuV{w;Zro%GyU^rG'Ϟ-#MYX~Tf>W^,󅑿TO鍩k.2%"@l~[NF±_U3i 1InIdedCASD;<'`C8j/  uUA)$--'ϿS^ *8C۴!O1fS"f3nrEěZK)`xNS⺋mᩰqyҢo>pAӃ("J3|`F=C;j#/0f8ym3k]ĮTcRU{QHPeͨ%ˈk3jR ⩼( HغY`CD @3af<5➍HgC8j.  v/1pGĬOZyEM_/O}8ieėuƣ ę1sy18s(AG ̟8Yդ$BQHP8z?^bw4*96TJ;q7RRU{QHP E Uj J{NmIhmFO|}B ]{Q0 Qr$>b_dĞEP:¾Wܝ'.mq4H䙜x&y@GE@ƾ-_H*/uzR9RA:{8B/V`\LW,=D[±T&&FJ{BKZ8epڹ#Tkw 3RD&kY݀V36rYyxmxpSYUN׳yY{:&>!FjX${c,jk+qa\m +v6 wG;0q42zFv,n?Yftb~Aҭ("9r,2$ޯأ3RSyQ@ gݪ'h@n #jeds>bCx.  ipuPʱJ*/fFFSXkSfC,D_q !X<L䔑q瘻+39LhEuh"L8;sꕒ`HOEAy/ɩ d(ܘakJ .Obxmۻ+p5hV2G ^/g7\y>Ō9VmJ'Ӊߺ!"z;#xr$zβ{9ICŎz6lyE>IY:_x L;Ty8'QCU^)T -~`4[Lgo Mm<.ep(j*$8Xg/uрz=B'kI{h ?u۠N@ކ{;>{@^gep.j«!n[OUO(+Z c>uE{Zb%n{@_Nx?^scs}=0X=7 :w@rd`"{2"i W; "uNul/;}._m@Bw@:ΆQ7|`깏':$v2K*6rZ=LP13A} I S5 @J_= ߉7Ӆ^@};2P8y٪Qb~)GBo?P Zӣ$BQHPuŒ r5ֿx5ޏ@Fg)αc+GOq.їa[G=O9 Ŏ~빼NWz${14wr~ ȷRU{QHP86JAD bk RTS*)_E!A֙(EK>G2P8xP\:<5ؙ0AڌbPZ= וVт|LNSVZa,-9UT 7^Өл32P8ʼnH~CP{DR=( /Մv{XH%IB*H@MPGf82]D4HcRÃR=n 9SGOCRܼyDMJ[d-%~WK{ [-lyɥ.L_S)J nPwMbR j($(o =u2_2މ8~epa&tr#2rxZ(V [H[LLxw#Yg*a2tM_cA/epE1߸2P4 #rO{T&gҡ2&EJu[?;M>_77}JjЍ=F;J!{nIM( Dn*lh{7W&[;R`HWE!AVzxbIPjJM839ʊA=Ó#nqm-)t&*%H0Ӌ<3g|A=^P]9LE(s썬l 2PGö 9 {TepNǜ[s$R`AsHב-X\ {vc zJ1_/[nv|Ŷ4v  I0$p봦$B6'`2c0l,epbtu4O6{*hHF#̒`HW E!Aẉ 2S{ zdMbe4OIټڋ+pPcn^b۽O xt F(Mt*`3/;}=#4*UXtxF U?oysE720jXul\^ޅA byӪcC } $Ng8T[FY7 d M:;9;pK *i]4 oFؼ/p=pݡ'G ^ bؗbpF;tawhZQ!pIUFRvЇYz! $6Wfe?!$c8fy@g҄ :2:Z*N ! ⪽($(cGԝC u<3ՍsGfD_ $Cs@2Aڅ}HEghvu7{tQvj2mW;vS{8P(lÑz'!^8DMC@J?eڨx.F{?U,z]g cҨ. _" g`S?5Nsg TyJ_ʡppEA {;Z #0`߃0oŔϚ[ ?Un)XLdwχJ# `êj/ .X{Wv?Şb_%.evD"0\3}3΁%<pBohEd[{pPLKZXaY\O( 'n;n5r/MMMFwܛ]+.i`HyEpUL Dmɚd(iUq^N SgٹtO'!d=U/JuK sdV->Fhr>j#uH h luww,3$ 8ݜi!(7n%p>\a17yϚ8D$\ F9(+FCo=*5s?ϵa -EV$^={813YaY\O( 'LP>{:JX2P8jW؟tmVy]Jj8YaY\O( 7osg{6FGYr2P8bb}2P H" 3C201Crn r\H(qcPU; 6òPnxJ> ߡLׅi\32P}5 /Xx{6v! AWEAC_a|5YCJ߃Ҷ:Uݺ:<[aaqT_$J{v}T|7+l4JaQWb)MQgR|O~PA2VI:iL2NEtȨnk,aT_$$j0n'wU ʫϯepK~=5맷Tw<( H :UYc\:  oD.| -2P8>tjBY ׇ~ I'(}r&7,1ڊP: %LõI=|x2C] F䃻oUH1Y9.joS!T^Bpte7Gcc6o RSvtʝtkQ 7^i(64Ep@qߞFx@h1w嘁L>ThüJ C IYRH~gź$WIr?H?4Es&ogE i '/ gJ>Js%Tf1O)K؊Z@FM)pY5aSS 5LJޭ()&epE)u,V{nQP}'@ɿf{KNuOL:`O:%0/!Q'ZJ6,āDÛ vnǞ"Py5$pܷ[]i{90 !"UӹòxP$LZ,IBR#@ZKt9狯ʝbq 6Ui[  K}.e<[>,+f^H^"915Zf2 S^H|>W.3D(ܨ+QYGK&\|z@u_%wB߿`׹7%$Gn-j5ðx/  &NCʕx#Fe6-,ǟ?&}H~r7Z@ozQj:9FE7SX#P0S}Q8(=V6_/Q/e63!Q e6(^OHt#q÷n7Ħ`%@2 )?Q*/xv]{.nGIkSk4BqOlU䲽U:GMsHطbH'N$^@J'1O8]BHK0, E!ANޓ|gAn%b1|W@wR&t`\Wkgj7!9;;1i:D:nxEXYNMXaY\O( ~ry5M $ƹgLep Q\xSLڏw;=q(?m{IK0,EAm ѵ&o'{BQߒC0 ]3,NKT F&ifiP=dX$$&d(N`XB \-ujerjP +WEfn[9Ijdִ :uy1>ڨ4mT\u [(I5)m& ѿoZ6M)gRkòPώv=7^m?)zêj/ zw/lW2epdTR?'y:Oep#,h5QOmVnTa 6 A1EDNwMӚȩ!<}o30[\{g9j7nL&r&<4=(~m} n<:-?8;&pkc$RɬF aWc KHs9dZ >r۪wm|2тE&y!@ʙݩi1cVlż Ԏ |GV̞>RC  ]I0y@51uhw4Q dz]}g2b㑐!: L#u{cw>{ F\PD4N36b]Y3jNepciA)W`Mn~#,/N0˹~wI 0wmɐe acg{)z<3x*{ă,7/"Pі1{CR n!=s^@W %W(ZO?^;W˗4S Npu%fʺ i nL d<9BPk(uyQ7;E9}ӧ2>;)qD뎄ȵ N s+^>_F96Mj5о|}qpsqCi |@ƃ)8ȿ\SpYŸ2yT%'=,#&ߍ%98RF<>. NVV`XWE!AۣU)&"pߐྞI#_EABZOճѕzV/!ߕ!/qWdvt3(>?r6[$ Hihl7M@ˈRV+#ũnJsmoa?N*sn1"'$S('%qƒ!(qx7y "`kɻbze.tNBי9ݹ2Pk +:'FhN<ʲrqx2T-T2:UH]AmGbHg]9 D1p7vҙ n7 #o3_ K0,]( #͗NGƕ#7c;i i$+0pH@ P $gY'Z ׭rjt@Ρ!@&/LB4O's$dʗ%4ElhM0D?h 7  ,RQ\f~g_EKKxð)oSòPn!<ϣI81S:Jxr 6 H>L𔁄}hM ƘĴ <}| $gRLepc.xMdǵ昩}S+; WV֚1{ܮqG~[O#WS(QWoGde a:) ^x˒NiCn-{Yq9"s?SdӋnqR>Ć1'v<'Ei eq=($(tf bQn&d1(=R৬*ڋB­Kf0Vg e ac@W}S(Kݐ7Q+j{DA{3mkICsLY#oڃx_¼A<m-GdS[YF8GX4E1,KOfB_1Ii֯͡_YBWpZ}h@"@N~;!/e~\E A<1540"U/!ax20x4c,40x&mҲxP$Lȝ]&:T5=6Y}>.ǯNE83Mep}(|hjBNDx`'ԟ4B3ҧ2PO.VOP,k;,ndQ% a|R'󄢐p ~֗}KRM2#̴yGվ7>F}y qneT|OxB {u4V \@Eg7S7?qt+3yю3{͇ 2"T9u%]|-PaHy"P!,,'[B1te\{$,`'v+YF ̆6bd$n-v 2P8EF$Rq+EK'Y8,|l4a^R7iUq^\I!;L<1e~~ ډN|^tY`~׫3uH|A?Kn0Otq9K[Y0~ WK;3~<{og[hgm@x^=]-p'&&LHjӟ~_nQ$Kf}l2?f^qL M..z  ֧( 㽳\4]F^c*3z"~͠'֓93Oep"ٌxyR8ɱ݋3Cu2tvڣcj:Oߛ̀zNm8~9y"+ )h e.Th.%pk{qGͼFFgV1iZ@DSy?E`Jbz۴a'8;S-틾s< 쉗]3/2NmN‘UhXшC9Iu2LQ GV;&1~U)߁ĵ nXSC"P(wLMy5U&<98kÉ2Pŵ(ݔkIQ['&H42P_E8]q{:,\%j`.0чk:\,,'Ü@# m<#) j.Jb6̾:VmcC >D(ܘzSlS/|S(݉~w?h ߣEoQAڑ\czòPn?h#}c[x<)zPj{҃D(gf_9b;*=LCrC$St ktsuslA/ AAa5 KF?($6W]}<  焻eQR4'oUjU{8P(=:Vu#_1{--77S %=uS)u&%7Xlkf-bXq/XDk9>ٷ-{M\]XaU\[ G"uV:IN "Pٗ~!@أ1%tߏL)so[בep/a6f y ;Yn[yÒJ3ln׬Vaxj$$Nynkv"Pլ݉j: (vqONe anybAøỳID+ Q 7ZUd%g ֣ю=suqUv A{{󼓢pq$ڝBy" "`ƑM~]+Pf"J=W`;/%7ב`31MH$_g0zZJS> 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{wofS(GS/v|wV210VbAcO3g.-Y ךS5Wɤɤt=5‰U/oBLQ29n|{M2z%poxǐ99댣SqGT-êj/ :%oJ{-"ݷ׭c'epc^6NΗasǍ sEK+Ԏ c`epd" v5is= V[B] @ #A0hR-=؂s!@^"?cp<@-Ƀ[8Q:G(Qn0iϕ;Ӑ[D$Tl;De=O(r"y`to(Ɵb0;bC4f2Q!{j'>p"c{W=+ET0jv`C+?u26tKڑ@9FCL ZLg>\Muf9F!@:P㧬^9+/ݾ@!bٮd(Νb(+kBeȭ Ƅ)ExJiڥnY.xVĞ/Olt!v Qxbճq=4t ξX*- >=` TSS4j9& ?wɕ[OYY ׭CRMh WPf +Lw('ʡа7-@YH~?cNaXZ:\>=04nZB+"P<:[ttD]hp(Nzʢ $471e:G/djUSöp:7flޓ3l9) QCS(/^thطBx y@Q@0:{n#8{F#5NC۴aw^7wijg~Ӻz` ^0iӱMg3ZVN4lpG/0W 1M%9L^H,Yxig|~DqM7#nvҢ32tS341}^`XB- Dʣ؟|ߌoVY6VIC4I_6`wa`/  g$㞦 nX}Ž20ϬN y{fJ;TCSAN 4■ת"0[M5nZYQ6Ҟ("y26Ԕ9WJGMLiGSo[܀.nk({[؋ڎcGS(*ڸ>]Et&ɒNCsd/-}O( '&W_MZ !V?] A;Ov,S:Z)CJSڴQZ}2%Qpρ)kueܒRYAmGfk*{dq#8C̝If}1|Ow`.:U$HY>8!d(M{ zd1-O͙D#,J@ f} /Yuzs\kEXý}#;`k u!=hsZg2g2C\ [:EPcٜ6FM/p` TD 1"¸^~Ww];`iM Ify| ݽjF+TGY'^Oys\uVƙVCoR>o;V/436eD+"->I7%?G[V0+rf qazr 2G%3v1^v}[+rjۙsZΦ2P8n3%{9.dݯ;o#1LMaq_$L:FQ1ljjiCey[ҋLj?PҾa0[b8ZL=n-,Vf~(@kvb8EROZ&m; 9㒓C Ni#{l45%󀢀 aщFTUL\.TJOwN]ab8Kq,mF63<=52З2P8щwK?_3)KlGKyOTzj eq=($(X. qϟG!Iepn@Zf8;MCX›^>(ٜl}}g@ž |7KĶ̉2;Awdgo+6IM=WH\'عB+n:оEj}]Ft"ro+-+Bʐ'#eu#F"ELepc?u+fz9 GΣ$@ᚃ^Uùpq+ӭ|c~tkuB+6cJ{k>OPP '@U-BK;!þqA'8*hMGq] AWEA#FSy:'׎ٴ w& Y䠑:}.Hg,'kBoG]x( |VQ=g&2PeW* OMOH }w: Lޜ! nJh li"-JCj)y[OuZO?s(ey気Yܢ n2CbwPDZ 384Xi 5{5cYS#r^ q-3)RAHY54r%< <ĸ\2 =IK0,wE`5bd+-Q1{㍝,((_tbۆ 7j/O:FХ.(Q&_ͱp zBQHP89>p9YLJjҟSbi tw))fn b&%!SV`XWE!AadV4Aom`50AfK Mb?qS"`k[b+_ Ŧ6z@~ .a tS %ܶ->ƥ𽭌JN Mm0ҡ0ƽ^}EdHZG 8"WC.`gFu:4|9}==܇xZv D8>#2)N#XoX CbhJO̖c4K +6L7cPacP(沖ɯD_HaFIڨ_rmO)}!SQ@P0υb<"Kx_xj)+0Y;={yB#&KQ9b#|zesnr y{FWV VPI6i ->MYz.5^kj[C֥1|< ygc`\L7yHLBlQƋe aέ9ķcmeî [|/Iy"+UG8#|&:t 0#|>w# }[1(x럊 .9Z~5Y4zJZI7A7K汅Cc gQ Cn~ȾY-,'SS|/6QTjДep۾%AN\76kǡ =ϋ /ʼH*^+WEŋwxR =b"E)be#8rGU1WK0,EA=-?_j}l9J/&b?2=S(@lܲ,{#!LZaiJ'S+M go9"nb-yUSPT2P82^BKZ"41+xy/q+5ۉZwevq1͝DG u`XB­{d|ϼ3ݚ~ǹ)w_=O>դ o $op<$o8n #$dO-;&H\SV`Xj/ 'ZH+E ErӒo p5~6vk HsEH#+:hw"$8$dŵh۳}=Uu=*/P@XϺq=.Gw[k&lWhDzg$DR &0mhJȍax`-Da!-ේaR-  6Ln;GcH&'S %{hҲB!Հdeu=yXXzi煈Q#hjFiE;bmS8xD=+ḟ"%pk]|м1,74 u$@Y 7TJZ̗hH}w4 R60xNO+n4+'sEV񻾙m_d\"dGAvR5QX<1882P =<26mޥB&R(Q.*Lz+[7/nehR6 BXr#^^C}7'MugݹYLS^RkKی4 ok|Q(tH&tUFxs~%H2 2nOXvux=ExmcpmQ—?:wŐ\Q$. IQi#nfNegp\gt;cgG:6p)8xGhu pKn4]OSx*S8ct2Uz:V3k vִέ׸ָhqQqҢ+Y7HɀكyίEPc̃ +y c͍ 5?ˍkj1] ,GM:2PՆu\gj\Ρٟ9u,,'st>S4H+0pby<:aN"[96fnw=в]_r*ڋB-?=UL' $C;6j P64w6O4µ XV>!0'.~c"jSZa{BQHPuƑ{+==GB=Xa"JlԧZ ţ>;\/AR5qT1U,Cо?}e˚n؂6.cIQ f5 _1t`'C3SOn4 w=jEwAmq;j7ɿn 2L}-Vt#7̅2Agc¥Ta4ҹjIK0, E!A]^ _us$?+CY#F|dg`Z=u 4aR>- #~GI3 [SFʦ ^,Bsɣ!3K8O*g ʪj/ ,xuK7Kv:ӕ-;zyfk"epHi6-4:u&3Det/b%5uӚ[s҄ҤLrdLbŎD׿}D'tݑG"@WEAXKg@ʝX]^P~m aL'VU{QHP8]aY_oב{MI -i E͸?;LO1W[UyJ&Ys޵*Kָȏ{[`fmF mK< OwH2qI EMͬodaoSҲxP$]{LtF4*!>$0H@%@#1+yQP"Z.iq$XiUq^n]敮Ek}¢(s|T-]sCB{{W2$MjB y@Q@u504Ks&G  ȫ4fAYڬ<K0, E!AA27QT?XY2P8R^vfw]{P;ӏ|MǓ`|Cfl>R3"LwJSɔr[3lҔd-;wRUX_4fɅ 2Pkx 1 }2g<< )~d[⴬Meps((θ?;CGOòPzo-nni}x@xH) igXabX5 a84nDmb s$ht*YgÍ0ӫli-NLp܊[E AMr0kiu:~Z}t; K`Yu ;h#@81ǒđcn!*R)uNi.9P,' T_6bo~Yvp:#$tɇֈ _K7:Abq01a調( (chGklczѺ5" L $I+0pt/XW˅$ND=r6*t84#{-pF< p+hVCsN׼߃eDooǥT2PQ/]? Sdt01rƭL$R˜niZf "q Qbpcg޼7(~i搞>}@Fbzh]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-:')\TztòPnmMjӻll4bfTM% ! |#'8![f8͘3޲s#PH80.:)0z/V/B !XA(hWQf,p'y۠-,$z3D\o\s=x!& * LSӘ%pIF3}}xS Q~Dy,)#{&p( S6-}@Xd9& ?H`J@6q'H6Z6,āDf*5Lx]sS}JLj҃>sČ+co_}u~+(X-8w{WxiNep7-WGуD(\o(ҦnW늎[kd@}GTTKCІS}8(\oDI}[w9:"VQVU{QHe,"V{sEaBgh?>VU{QHPf%H`?z~ʜ(+. e00eWBHw."pgGAViN-aҤ-+ H;$A{Qٸ',C+@6ĢI9g}۱i \70|A^/䧢[@ĹD#uaQ]{\J|oFV4rfH`5= }~oVWzFdUq^;ͥ3& r.tϝ]gIGbZ#5mWScêj/ |{ P bhbq3*$[)+0pbP*okTRep 9HjFGb201\bޣ Nd+5%RpQUؙ'UGI:N|g\"*BPі( ֻ3+ zUuQw0]YI@=_k#; RGl9$Rk eCX,G@Rߵ<Aa.װ%uF(*ڋB­$HBbo}FY 7veq$!>`k(x"R՟(Kp;yKE#A@IB(t҃4', (rF '|rhRqȵ:YaU\Ӄy. 3Nc) kCڨc2HpMKҮEPS;7.]Tr4`&˗4hxm%K?a΋ߎt|L/{l({C9?c]җVv6XJΡ ^G3%Xi)K0l`q68j791qLGnC^>n><[`Zαn kk^K~ ⨻(2|ZZw}fc˘s ̨J"&Rd.FmVK0, E!AFd_vFAuepߓʓc(yEʝW$v|r7.9=SRQ_Bn]Q6GVgM{/EgR |ޕV`XWE!Ad#c`] HVnS~$NvJ<)EW5Wj)jVU{QHP8p wԌ U@eUH[aw7]A*:=]i :}0è8. \{8;;Vp|Z1ey k6B΍9a9`Dk@OUw֞Oi|op))|OE{Pp9"0e(Y uj~'μ{Y[T+pvOr&Kǭ;bv<(>!wY-,'s8[YEnIusCD$Fn^3aUq^TM)w$r=,ЅpY9ҫ0mTq )ZMGA+ܣGKAG cV`XYT6།J@8L{aMV'nyCAZaU\׌eOWwCF9E;BǑ^Td:SB;Ov΀WI-3 \Jg:7I _\OaR\%MMdث9 0~ӣX [|E|E׆Cx;-! qV(_POZx5)Cڎ6iڰ/ &._ W [T_Ūb,0jSiH\< efY A=nUD$;T?(x̴!--~bS '@ r5e{3_@ឺn.;QWRk)>eaЁ~J\sn78C(\Tn J_?עr `HEwugh"0H̖~Dū>{g}@Zsx4IGPOFxfCQZlC$yH뭮ggj/,,'[?&ysRi!T_ uI7x†QаX8yuFS GF6T$H{gHOeq*7ꠞL# 0,"C'<9q\(|03H⪻0P [ɬiDmiџ"PQnRS(tr 1p-<>fw6&f8a eq=($(pfA,u0_Ӯhiڟz!uӕ&:2^l uDK,@WEA* P1Usl2 vM;\hf;+mMa][u{K~gҔZOX&#9Rv5smۙ& t5IQq]$LB6|usB]TkmEWmKKz!\ep\W"[丸E޻d̝w aKXG02>yK{3Rn7"3 sxM:@jeM:h-[-*E n~+?aVr>0 !{-Wij/5w_oMs߉2Pu W qYO(Iʆ\Km2Pq6 SX2kRPJ~\U OHk22biW~?$\a!}#ћ漹!( FЇ)͎G!$⷗!ã½Mk?^M"|i2'[=RP ݯ7_^0ðx/  f{vt,zwH|ISHhP>#eʽ*c KO0 gkjD'tK]K9TpA~y̆`<*p&!4AWvc#=̢ 1vD}9{6r2 $"<-3YaY\O( 6-t킅lhxi_Y G300_dّbA[Og8n:.9 6qvoZ aٖ?Yf'%[NA yhL۹E IK0, E!APЌfH5RYiNi/ܗix0^9]GNe a(D~k>+Q^ \6cm0@oGZ;j}̸YD""eSR-òPNK:W;JD󺞣ir9qgڮrKؖV`XWE!ADapQ']ͱdb5z2\R먔($ Ztpmu }y& 6#]͡oi嫽(CE.ºX攳1; -APn4I#0`*Q#b$j~WnKfƤ}q&;pg)jݷ֎q%2$׃6K&ʲPҎ\0Tuʢ5Sy3ooҬ]+]sś;B|iY4Ҩ. ;ȿB#rO‘\;%(9TzzcݍZaY\O( ''7ѓ&q2k'\#c'`Q+3U,EC=>á^VK0, .Z&(e0Qi -LP1RJJX)!9R 9N"Tfz<^٣ ΓFGZ ׇ &i@qt- §/v_f%D_B!hC_EAtK~2lFoG73 ؊ڡJBQsc^#eE(] &#oep+pFb < a„|hA3ah:/-}Fx)繥S?&\Y ?wx_?!oYUis{m+aq^$ Hvq֓^*bP՜-t'kH<>UgKV`XWE!A܄6FX)D'&: UV`XWE!A8=5gAcq:JH?NҞyܦ $1\#Kl byb8]YLolo̊[q$@@mmr]O Nmrtx/"q9Qg-#n3Rtz||X ?nU׶epH$[PU;DFZL*-p+*`>LN)h7;=a ⩿( 0 ;-fgram0uP@'Y,aQ]LtC>Ɏo3 Lpse~n k8I*xENp$9*ڋBI4!) i$5!ln=Ν~J}ɨoZiɘ@'y{!ͣBr5ÅE8p) XaY<( N=UP.*]5r{N rGOGh7f;*mi0bnA4!Pb])|5X"pjXdԑ c>F&f0l;LY '玡(kB$'I`G 1?Y-y,|O\aq_$O?'Đ[|qP^~^nINtpNjJMpΫ;S%k)LRvQ{Q8Pv2]ot/pp@ID͏М-~Fu:Oaa䭯EPc_C!TСroBdd@ ɣ7,'IW~H+q 5@B wEm҃1H/  "@¤`Jh ޖt_W v{9_/alUMu~NOЗ59b/{vqt>m1^,S(ܳL|g}ʼ&yT6H#i>Lf0)K7@9xҁAػEܶfMfPɡ."-F6n/7}u=?Yi (QI'pa젷KHdM'yhM)9E=vn(b3$"@wWSC/knވ3E^2P8phŐ67Ƚ.aw9L>V"Yf~α90ywu"Te as*V9.p3-y4b=4bTep1V> |l LE|Dԃ/g}^42P8zOM YbmNܸ݉ΧmM{Uk(\_$ Z#00Q*Θ~U( vLJ[Jv̸Asġ&I0>ڟ6=~l?`ꫩ n!%-]k nԅXU*4RW v(pE-E]q9‘ ,bsF {'e([ي^B:6"PX&mlI#ź6Y "m5B-W-^JN;Kk߯gAV ^\͘9ǾsD,P%( ]jwoHZ[x-S-|  /$CzF _usxs/pkSkUO芡bWq߉HfcRf`;b]vhOf5м8MmO_ѐs\vԝ&N}yQy11.Nh8#頌:/VU{QHP8~DZS4~rh`Bi"Yql'=&D+*ڋBti{ܼvvJeYq+ׂ.;!G_O?IyR5xNq%G5ȅ/GɩtAj[&2oRX)#q#YJϳ!a}嚰ɩ]vE`VOU)RzGG3yU{Kї?77Wt[lGm=|n@|5գvѓ[\'DT2G}R6*MPzIf*+D}20VXFUk4?^%2ԟЛvB5ǝp81 ÕduP&(=ǔL.O#Q C73pBȍ<+OIc TaH?Y ۧ= 6}RU{UvоlgL#;Dd0:X]d7=ړ x߭֨]{H1='@ѷ;FqE7Π뼊S~P=g~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 "P 1*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ݴVSTVKdjbpg@~e6߷@6eyikw̗ƒ҃o\8SW}ۅ@ UOU H43w&feD@J=i'rC:jJ~iZ8Me(4[~CNy*eޱP~l, |J*c- _k +_o[Vw1K lmg?.o?,e6q'rhcx}/Ab2NDz[m_V.1D \@ Ǘ݂5fV5OloHT[1^^ߠeWѬJsB4vya6޸E I0$}-T JOlXHҮT7WO2z 8^*}*o]K! N_'C.%d'$jzU15<ٙC_\;qӋLr K ,He3X]QJ, x |N6 XQJ=sFyޯz@*oA>by.eLCg8._ qr:?Ý.@[̓ ƌH(5mo)gH!Dk+lEI鞣3TN_H82K( п5uH$/Ҙ%Y?>HW4.W= N!D|T@[WˇCZJvFo}xq |?M&9 *q!HeKͰ'"`9FOdcgIBHX/]$BUD^[bY@M)4_"M"VkH?^}-{9lnta0Ů˜^Rm ,\ 5Se%4̑ex91, )$Rh]FlIۋͶXfpJ5IFV7@Yf/4g2tC2g؋@i'6L L:\d7>kM ?yaLfLC_^PRHT[w-:2)3̖e զPJ,S.П, Esm1~Rl9C|I:VIiwM;|f*W؎]4I$zZVh76Ή&j  $,a3dNi瓢TިoG$mno65"4#SA`G`4Y RU{Uv?y7}y~Sw_\ x)@wqXf"7h1ugmJ@K3ކ݁ 3=`/S,d(E(3G3,8p(UFk(^D2|CڸFP2ð2ۜP[چ7wQJ)']w6zXrLfYJk巧isW>ns 6 =P=Q'@ UWU*Rs* L#c~1Zz*JvxzG:Fp()S,iD-y`IxsAM{ {ʉB,n7VjYF- 1b,Ok`"<]<ʑe,>2O%ޥ!h2PzsZOgu oUo(-Q -704szNPםUS{28s7F8$WbnxS\H!Y]-T J15Οx떦Zp>R&·*M> 1#JxxàI!U]W Jo[%3"y! L""lbI q>6{rqdD(z̍I&"uA.J (]+ zt(sA~U%ԯIJ{Lk"u3TP?5A?qA~Sō`,2Pzy_Ub h>*.݂NW)f'@RbgUР1c*v=0'2j㖛'020r+ J]G8RGBY-t_"(}< 2D8 rο~/oTxW\1E\W'ArIő6TŊɂ!#jBɊ@%F. p>xx )RJo]\ X2S#=_//HEX38m?qT#8h~6bOUZS߇,D$:A¼\}J )=_o(-iQFq9χbY)\$kz7:m SU> #5k"PZkyv\ay"z[ j!)#|^-4,A7ZӒ׷̏V{v[J~yc558@r:TgoR ꩼ*EjiA'FJ LOբ}zrc@nh@[apRe(XxYxL||?k)6o[06fآ$ZaDzNE:_)P?/W;Wηu_>6|JNGG\Ц]ꭻmp4L9)<\) I3 td%:B~Tn;:$oy+C!vM=gJd/x .1A$wϤ)Q=] ά'sQ( (N;\BR$O:A2``HwZ°WP!6ބOڣ{|`r@H)+J7aFANgKM)-6 h[@ v/yt㧔;.II0$] TRd<\:ahZ@h*`gd)_yvY|)RuhDQ4 _ԅz.b730Zx5R&Lۏ mnq1 @!faDោyJI0$4Awy)>l&52l"J!\G7])(?JBSwU~:x@!"|| pf@W_Itr .-fQ8;'hD)I0$4Ar%1yGL0ݢ,[eQm³sfdۂNj$d>@ ,@^฼NӤdݞ A4ĞD><) duP&(=1`h\={c-怍>sA T )ȇv4b% ̵xR::Q}6`g@[I0$4A )$̘iyK:~,n0S{5&)=_^? RPdoD()wSpepJx<;Y/(F.Դ(x]㝾KJ!U=WRMO$^u\? to!¼~[e(q@] "=>\ rʫR{B[_<-?JEFOܠ"w]=F(z;΂0!2~jL-x/C 2vEy}̥tp#4dUuJ<m2͝n!58{vI0*=-T'7DTcx.J$ -Sy)f]9/$)fS+GEL< *VBU`8 ӏ}bԬ77-MqjnΞA )04A{M~'RJonC[ .>D_B`7ef4һ`RQopksaspToe&jiށ&caD2PzaJ– ! ?ǟG7^- فCBU.藯kb݉#BMjT NF$6pgO Nc/:C]T(wBfb-׃|cLػS 9rS{z3]Bߢs{`^ /2PzXwHį)>'07ZSx~xpՑ>]@3>sK`RJVuFE==r9\#)x!5CÅLU) G|fX(֛3"VVJkΫ׵m8{;Z~e@6y׷  LkqoHs<m|>D?N"@͑MHoq0'9ʰ12Pzs7ןJXB#Қ3@7 SUԦTR9*'}*wZbBR{.z xb8A yq Z~h +dfyji'O#@N1L$M LS# 5nu"}=fSz461SD(=#R*@Jr~RJO$lUEeä$@U զP:Y(vz6NhHI?J )_UimL z8ܓ|W2j]$z{P(BUz7~Ivw/e 2q30-7 {؞\_>Lp^w-eĜnj? c:]KTV^NiI}CQ;WhꪻJEPj> +qm<vť],w~IUUYR祓?-4 gl+sSLen0,Z:}|l늿`[Qf$y/;lFzѭ^"$BU<+瓧s Ogt1j@Cz*JWs2}^#ޫGK]%ګ7~soyԈ'%PgJf ګǿ#yc O݊J1:,ګԘFtHǧ(#'e f2yWӧ`b~ %A RV;fZVlxQiWjbkxҥj zi2Z;K(LrbA*ρAw)04A96u#qbk䳒2cgiGQ/Õ9=]R8+@uwuG{9Ro~`{^SxȝMJŹ蘖p?t= WQ3J5ê>&ŷæ>@ݳ RJOضwoDȘ؉߈u2P }6\ Vu!('H a Pj^ %䪻*E;;2 tx$)(g e;{XRU{Uĉۤ0+?-'#_xCγ2Pz?g ͈g[p賣f3,ǑCZJ=6l{Wo26h(07aKޭ!.$4m_=u4+;~\ǝ]ohDD8yˤ/"`ZH2jaC0I1QL;l T&M:"=֟('bW|@4B:DF@#$>w*C VOU)~ JsqE>y;rM7ߙRګ'\9 Jqe̠&fb^G;CCjJWckMa@_! 3J kI)04A鉳yNt >*@鍦#aVBDQr܁?y3R I_ UiۺQb0 DdH5=|WC"JXrBTvͱCo7B`ƓGeĜ8t?UzmL K~i݂E!#`K{{§vIh;D,$8z\CzJWuQQ(xݤ^J_hCW{U5)yLk?`ڷ \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$99duPmYZ3(<$3m#w\C2Pz(@ĝsP؀`=BVTR~cd-q4aW'~`/}0O>/TJ!Y]-T JO7NK`+AFYiMO-ˀ!S5WJ}8uC3 ?!&៣nbA-sbl[[,bGvx~j!S=WRɹ"z`1cHt clS oBIUGUВۄ1Ga B驾!ajߕ5f_}#nhn[eYpJAM-kL&yX+ RfLcssn'ȏJ'og[N!Tu^&(=9ϘJ6q%N}\w?5sV@ iMVyOɻBtr;W!PYqUZ8:])+voc}ؑn⮢" a2J!BSuz vS.dN>)2PzTWj"0` (9$~%=崕қ-^L8My:~)7j8}6 NfkͯS5ft|-Ge)kb0 <2h"PZ>g7]<0RTไKKv^eCvfw&r~ް:@\ R߈0f |߳PO-e=N3"ND(=vҷ;4hӏP[fk9e2|,ygbgp@6$FiO9_@UGUTLF}M8x d\'E(WtT€'㡹 !vۍ =,؟߻}cJKuHQ~#XXo )0|W Jo\\d|"ix oԌ|^?zbfFnuR&ӓZ0L oߍ0V -l,Q^܌څ/7buJ@ ڽ(6FGq cE󐯘|ܛDM_3Ź}Z̥z4=69c:ϭz_ΰNW /rĒP<`OF#ewu#l;/d٪o=IH|O ޗŚVR[X2\59/0W*0W+v{L~`PR2`GU]ُ_#!h+=EW4yaxkJ ,>'v<v?5E`pv̈́BJ@qiS0s 8~; T!ĂX.}"`Oi*f||,;%eQD{BӦcgwAq_cU [c ̝`gX4F~EJjN=] d+ܱPHF':91?ʲ1YR_ӎpaF8?j-=ey_sYZfR5gE Ԭ E1DX0v}Kx 9A"AHқ3'lNDJk"ܟ 'ϼRgQLS''XI0$@h ]ĹXэ) l-G 3ҁ75tFwԭ Utc+:7 *HQJO"[$aGYPrF,Ha]Gʧ |A01 SU@89AgGQ5#];{ 63dCz*J}`U)"QRvv+:KJ,#>^j&> #(7N&j #c/f{XiCEͮr@Onj$Dd#L:M"'(YJ R, [( Tj儓^f *+;a!@̽ ^`55b~NG_?RJa\~B5Z8g2Pz"vx3ƃ67zCM8vfq7OPSA}R>n}?UMFY[Ὲ>pr gC+5A>egp9ə^K7>UQF]L;;|s,Ճ c嵤L!)"@Q[AvEN ͬ8ip@uoiY\ b/A{7ǖ/@_yU!OaW$Rd/W:;d6IntcDM#~ { gq(e{6ץxDJ3D\%6O"PZSt!nEջK < QJOq'1/>NQvr"'2l`-YoB j*MPzsgӟD=wŇ#6΄r: EeBSwUD8p':"qrg<ՅRxRR>_3rŌώ< eTf!:nHUBaơne ~_8Cmx=mL'`EQ[y/ h꪿JEPjk\ձG9{u%9j7NBoJp%i8娲@\*Ϣ\ۜh9<"h"go!aRwUKƀQ24XQ||#x:|[t< !4M |BKϪ>΢ $\ Y݇*SfJd MR )@^&(/Ri09C|!Yə5Zt>)P I@w. 0" Eֺ+PqmDh :~dhzx{݊)0A9 L phKiRR(hfG܎BfG]Lh(w]Hu[w5PJt}TWT3O W{&Tu^&(=^tD@/=Cn^d=Q TL) f -S ZB=fy׹$ݕKbX-#H5 tj/@Z k3^4#52GK+dXr- x6J)04A MWA+_9;Bj  :b?<ݾuGI͔]MDH{-bE!!S7EW؏CjJnc [}+y6xC=0h"AE^_/`bH;.v'q_Fz~MjG-v]-ވu΄Z${oj@n`#1D QRU{UטHa0G+ hvؤګǿ#asl/D ˄jEe 5"4AQ*+u%8+^V,Յ<׆v=t~č?')ܑr) 4AxKx#:R)!v(b+s[yxű' Ac>=ypb"#(i7ߌrOoF>0~{꼄u~/CW 9OU?܇ORJoZİR- ? +RJi~Ǧms~D2-.JEH[s(F9{10<-lBpCcO~ J<[BSwUJKxhO XBZw6|&Tu^&(~\,$ *CN@ؼ !䪻*EPjJa9@6<B8rE A-^}/:(Y9z&ysQVW %D`xR#l/}h9:z}2PzmA6(D[Jy !X=WJ_Ԭ*`^mHV}X+G^ 6W\lp,>eAwV*0S\7OɻRZ汔CZJHÍW.K}[4( jXZggK.#ꜤcD}6&DIɣ((1ٕ%"#/744ftQOEjLJϓ>R ꩻ*EPjǜvW|:ZJ9h8Ϲ vr9a>OLF(c8o| DFb[r䪫*@iiQ| ;<2Pzr [(b'}>A1)Y\̥$BUMz]}ɚ/c )1a2PzJXtR%T_Uu3m9<Z܌CQ*RIi9R j*MPz}&BEU L7=-"E-}(c)!#D'nR@|"dy2nƫ\䌘pO$rɆ9.$[]%SYէNY@Ė?,'E~<' ¿T_r$[=vYJ:72Z]b[qa+ſ籣9EEy\[(Um3)>!!W /^Jo.=wd2.qrq:!d =NS!I:,N~)H!ƀ̡"cetNպ at0B?x=MJ!eZUUi~n{dq8Z=~"@驋$@Yn<|kKqlʞ,+{+W@o)M ǕHݞS6/`pлRU{U(?,`DI=e K7ɸ m]xנun/饣DzM#=n~^~ ۉ/0"ܴƾԘ7MMG?Gobr戢-"4"GI}]@D\B~Rx/%etzj₾4N:#fš [("yN3cʼ@іJrC lي@iM!L'X4҈{@iN),"1)0\9:ߌwo|sV H[(=j2Vƾo,{Hz[[Jk Wdq ;]kJߕ;=Ukv+GXA<.HM ו3i _k૏G ^з/Nxu2jr?d^w+ @*Ʌކ).XU|10<-qBOm+Ko#OlK]OsL=bR&[Ifu.R j*MPzFsQ03:W~gMʲ$Q&W3I@BoJLlBC[2;ǧ->mSb-e8wiz~<m0WH]Xx[+Bқ :2̸E$Gwо" a݂ oo[ f`?h?}{RJhds# 'h񽮗q@MRm-5w8ȄF,7$4rI*40 z,Cxw-T3Ehx`g631e1OxVr)/N΀|YJ0I {ЋuK$CF -т({s7H}?]}8p_x@iقx < !.-۴yBD~(1"p2:D|2RG0ї]$P&(mx}| :>"Tа 8kG2kbRܻ+Ir:ǛWsX ޔBO4Nm} T^YJw" ݰRJo/mXC{gUOQJkٳDC70xƨRc=7z1{q;t$0;/ev GX3OLHhE3߶7;-"I>YP>KJY2ӧ+2b#}-LȽOnO AznCW{UDwC*{Zw"-NFl uc=~z'pëJ!T=uWJm*tΓ犲7>Oii˒Z$moQCt>xlx,)U]WiGzojFp"g%)p)͈۟vXXra(w^IjJbE RF3oSXz-N<!DC0M2Pzs԰vD6o {饘H,TM$I,dCG &PD͸R$x ֻd/8 [> Jz2()Q]Aj l݄?0BURl(ł@FN E &.܉n4N؞+CZJPHV֐/I\d}cڏdwD}:_msŰ󸧏M}Y?L#be`&abGF  `w?#yCBUx zbo@Q5uJdT`noĶOtۦ'=yOnV!TT^"H5ˆ-1Sn)MeTR 'ez'RS#]KM5w|E|h2G;rII0$4AΔoqЏ(Ey"1J95 +n wD#YxRU{U` =,u>ǝj;}kf2x'o(n3Q3S勔z14ÛHm #@}A+UP뎏]@]q.4ɿ$|~ë`o݌c5K);SlE>ͪm <E愿=QrQ*r%Y@M'$FQ\U!!T@E Z|)5>hX̞ -ve&"QLUQWHGa$8&c`g1x1bUw@)كsc?ޮ{@iqjXr/!4r^H-ef]:ўF]D屐,/eĂoe0{J9p\.~c@ ~xS$BUaؖ)qw@"e}z1AN#Pc)śڬ cmE6kҖliu־8+т?g)8bކ~][T? O,%@ UWU*R b $'B8|G2o|mA<*AP)-G)rR#3Y#O.)iTxr oCjJ_ c{/ ( m<ݎ 悢ڑ w/~  /_s=t8a#;<<Me{yRe }sW^[J{Rv72GڤxNuϱgтl;LHGMJy;h)7f4 %r#Eˡ5)K-^m}LGm(5 Ÿ޶BN*ψ"zR[*(pNƱxu_-) duP&(=^+{R 6GÆ 8;a Cy#ىwؤ$BU5&حyvRf{NEL<#Mt/0Nthq|U8Hқ_pB= BwE 5`Ǟcduz7LJ!k*MPzb(H?]!Kl:W0so!g&=<;cL洕NgD.Zs[4+;,G A#ߏ/c~աF()i ĽS;$ikVHڎBr͌ AD,$~7`bNjҘ#,P42a0h)](b~lFIߴ &!&H~ >p QX;ۓRtǵ+"iR)(=0_9ZpIDk.@Ѹ,[fBR]@}hTgKo葦 @$ܜr1W2 $@mnPΏm#VQ E 7O/uYJ2{LeG?vIh5J':˜/p8WTrZv{y.pz,hr{X$8-x]ڧyU+zR MQpz~c_4v-"i<-T!n<\%X3Hrn=PdYŸu(봚EFM1}$Bl^B$RNīQw?Nl^O&LI <I-Юyqx \ګ'~ݶ`@'(1Hu ()0AI[iWG'U7[s#S(tR ꪽ*MPzz}8U /hȣ_z5-'::MBQ#*XxX.#Y[!$^Jm̤!n6aR`6`)$Qw5Qw) +bk4WHYJjJLz忐I[I;yz2KzÆjklwdoCo<MDiK}t'f.:sMl٭ QIŰs4FKr;Zܥ^ў Cp`ȏiELz=Ϳ*cdK^UG=Wz(2Pzԭgf'y0#&f$RnI!Y= TRMN\L~#sғEb Tˈs >(!P$BUoSpmt~I{A``o{ }|hꪻJEPjⵍ;BR;*)/~P v߮wIܚK֙k&LL'? SןT33\s +%飸z`PeVҏܘ?%` 1?J ꩼ*EjL!Nxs.> LR췭s3l7~9@3(`ud}uh ~ozӄ#vXsUH9'pu<}~-,KJҮ=' ڕ-(G%I>(>mKI0$4A9fomzA.R~{z02n^Bs^2PzBt3Io9yD([h0 +TS  Ihl!>J )_Uiۏ3qXcUqk ť QRm œ h=Y(N֘4uj{Y7o1ê#|lܢ ]tOZޓkH53\4`c<:L2j˒۰+˸&ze˰);ch; ;"`b(@E/ F#Db-x-B\u^( n7oIK*,+E[1:>>,;iX V &3Zntxw悾:L<ΑP6Mtrr'̐/!N`Um).$LHP 75chII&m?]- {/ޠ}_H2G9,B&seٶ:]9-ah}X_>$|?Vi*"0[~T -x`, H z(aee?~[؏wCsyDz  n]b dVQ ̋.~1ʲp6FciOc9H$HQzL+w"?xVv WeU  N'\5 n4r,llL:ۓh™=gǪjo Gĩ{S+Za|3<;#9Z'guE',,F|LR@gATU:jU  wsdVIDP=s() ~ Im֨n#=7[EHtn  h=@.A>t; S4Fsˉɗ\,?Op}O*Q$ Iݹ%?cko ƀaTDJP8Rd<L9δ$Np>'QWTe`pc#{ }0+tY;:~N;nN\_. ųtX}4iA|iOZzB3H0ugulMG'$lUWe`pؚ:ӰCkAOmSiP8x痞\[|ƾ_?#_m|ى~G -[ζ Jo#RQ6!aC[1-F55j֮Ejot]Hyzl\NMz:$*#F-Tw@0@W`;Z 6ebٯ5ͱs$vymB7[F)eaKt`&[kX[R5;LO'o.EٓU)4#?,_,eksۄB/0PX(Lf 3RdJd#ToGOR:WWp'Rq3ޕl1i猋t:'DzE 4lY,9/g[zrNaAw ٞfE<_zXA- D333Rd͠ bM Jl d1ibCrq[J4T0(V-}8zB3H085?-žC+C9x2S-2)Üm*)e_v2ebW(ib MS#Dz  NF yQZl4\ Ʒ*o^@ t1!\{^jS&˵Ǫjo 񯈟Eƹ]=۟'atzqh>nɞ6U^Q &2W <~e ~Ӊ=՝zA>YcBOh ''(DzEj<Wv>(_t8!jZ[?:\5w͠`n j'VOKtI:pRWߊxyʃr(7O EVُ_̜?W!&xU?$ޡP8vpzK3X=]v\OXAnHrWڻ|q*tgN,"r>?c{V̉䴉eq W¼;k?g^ PMC(کΒ) =.Yujʛ r>RB(%XXM~&\'i<5zj2*L箐ҹϋóm&w#7!Z,&7?Pż>f8V-Ry3@а Wo"M*‹0Qnǯȏ~cJAG?N.3e`pM ϽomNrrs妞ו!8-P}38Ш߮gtrOs#< 6,0M4 jh݉iAƩ9_A208>!Y˜i%EEbʴ#!mT#BFe**̇u+&iM)d̈́@-g}Xh@=V208 ՟̲d)s {Ma,/C#ܯdNߋ 51+HYz0u0 Ie/An*T/V[cBOh '.ʾ'&IVg>$=~ (X`a\b@"S]h$9+Pǡ*cF'%T*AJY= 4l<1'."Q' Д,=$m7aI|[ʞY/\|Xէ20aUXu#!Sho?j0 w {vUg-dAIk,l'4[a6pb\ ܹ;wnkk-'%~IZqz>>e&B*y]{ m-44SA"ܙ8 \Db\ Ǫjo gRRs ($1\Cg?3}mU  x)6@q dew[ϧݟEF 9}Z}i,ѵ%[|đ6mRdG)ܰdeaU*N#UTQ[NKg#gw *9XAg7dvכ*<F IzQS䛥 EP&w499*Kp,[ V#UՅK~@ѣQ|;yu. W *Gc|GT7F'\ *Bǻв%2W NY3Im'¥5ӦW9)QyCR\Q;no\*(l(Kg* KV;S8:Dwp, yoܻFlu-l{(ԨgܔEj99@NP(ȒbR< e>*O8ї½(3u}9QAv)(1E)٪˰jB:eׂk4؟ӒQt bfTVʰsA}-% h?_NJfu7(#{s&F+š +GeUf`pzM]ymV絏eYbL\&x 8c&yhJͿ]>]F*Kp,4Rf~J᯲ ˿JݣT蒫H x#TTlH/ G<0!92Ѧ u+YZ0=j^ ˭%1 sjibR ':Rl*h+pZf`peazܕY-9埱 %DJ['#JڙJe@?>ulԙ'΅gCw) unxdz#.!vdfK>R,Ua;'k/_-l'4[76,  9ɪ^Jk,=dUP:Ϲ27?c꭫l۹v*ۖMx ӆ~&rdUXAwAj;}~D^A$<1V •i#pZf``v#ء:$Ne~}xLt'yJ$|z&coO"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\YVcbL.xʿCsY0mѵ7Hk(n-IIںT81*7V5l93@rNP e`pufashj9XwC,0qjŴFL8hYV0KiѭGO;+MJ_/Ӡ|N_WS5߻r.a փQoTMd;(]G]} ]04ty$b!Di$x*e3$72[m' g9+$: _GU 2Q5y:YW 'g^nQn\:ZFvn_˄x. 8H|0&b}GzZοh>ߍ̐' Ei{0"!W?Hi23T5Na%a`bB^z+Q-QgMe`pd8?ןFCך_Cښ9cβvzB3H08V&ɀ oTe`p2Y)f]U&y*=vK诃 2[ .3ų6ܲ4wy|! itQ,8t }3qZ@&TL%zc3u-Nsj e  N9XhŽp+Id* SsRRRKI+ݻDb wWm e =$ܿ <#i~$֗2wBrVXP 9H0ƝCdee`p*YױwXrU7F zre`plW(sh~}ݤ[CFьWŔ 9m%8-f`p8؊U0֞gCu0(Y  nu> Yf؁dEʌܙF]J^FMcznxܶz]zl'q[!m e =$zXю8ИCBEQe`p}׍%dȺ͕g5&T%eZjLx?6z`O4 &Cʀv:fB^K@Ca|VCPr; 6yBTp:SepX=;$F/c9qWR}ĎmR/'IqIߍtsD9r,E`PH>jSe`p >zY%32p5TC3p䷵GX6x5 qx]ɤF"^1m .zVwϛԦ ? Mt'}njoH){ηlgl`g)tKzNq.{A9VQ[cBOh Zl4TWȧ8$F`bu7 ["~x~̔CRbq^9mW%R"2iP[cBOh 7(PhN"Ղ !hI2Ԫ*V{3H0uUBNϝ)\h#V^20(lЭֲȍId':{wʩ`$߲Ovj-US(K#g{%L7OGœMY20#{u]_CnQ7W_jN}14wYX;+*ǝ0۩PڡcnKc J>2s & `:cΩ 4sՓIoMSh}jOX |Z > G~ۗ'hSP3;.]bU (G*OYu-I:6/v7QH=3J.%(A zaD<77EcgohаA2ܞ݈Hay{ o RD{oCE`P:ʋ E_^ , ̄ATYrX]~6k"U76;0wVlXu' )OT8Vʛ>p?߈bavRƞ'Ĵ~iYͭ=ҝI y`"@ӳ2P*F]jZf`p!$ĉc8∆LAo`E1qls7imiL36cBOh gzJR+Kn b~K9͏Up'(  L)eP=3.R( -0؈ҫp aw4N_kYƳ2tI#xsP'Y%\ə~?pR8TQc=R,Cq[U{+j_E]ƚw="6|Q46"uH?6ʫxxhK)eIƞ/XJi)P{'rN"4LbYWU0Wc a1x#Rgf۬t c~`8Y7p5o?#Te$gq*ցtDjw; ZO\!!P%NUԍWYIV&MZڶ@c{]U  ݥ!RիY29B̈loDU{ |y.Vغ&Z7>s+w7|~cbQcvr\`yWJ(W.&Tq6ŹgΉL ԐlߏDzu{}t֔^-5yPǵVy); yݑ Hy?nQ[=J^@56U/7I]?-,D5{ڲE 4̶FJ\3Urqy 61^>QU9qL%G>9^FYJ(ˏxܨM/5Rv6W1tsPMI9P= 2k"U79,O_X0ԎƗw2uTRSUիpMcPDìF8E UEj6- ^9A1;r?#=,]h w>:!N囮2 u W!]vl؝eaz]+&ʼij{:cfK &޴{PKmܩ Ea1s/e`pNa Hƴj3]Em e =$]+QaNх8Y z:G8V-T{3H0@`[㩷󟋸 c8V-T{3H0@o] Mwra΍uscf8ιSʼnvVzJ\;F@@Ⓑɚw}}k&7]x5ǨEn|۽Ime4=XA&;Jm˹ߦe`p(xTfj0˕)j-?+VCZ+a We`pÊC*҂$e٪'l20&qP&> \Rl_(4-ltbVC$Hׁk^gZcBOh 8<͗xEn !Ko_e߽M\\S9ZBgoϬ/I.JO ̌I= hǙ(~HJ\~{ Ͱʡw!zo2>)Bf z# CpNe`pool{OjT ;e* oUS-z $l,r i'Se`p2 #HtQuϮӄ4`ÝEPXT׺ee =$ܰZEldi8\@ݞ#;-reCիC|* 5R5؉lt{H &Ame`p|~J%̛كԑb^]?m} sц{G@<;O{ Z$# \مb5ǨEn/q\{ RdZ xqIeUT 4LD!$論;Z^ xHKw2'M\4i&o>M .0ٌcl ]ed@ǧxmVpB*ϢI̚C3r) 9J^$!8} -HdJTY0CM6+Cg+ޢƋ,7waWQe~DseYq,Cx !XCWs4S|w}2*V{3H08ݏL~FIhXklb<̿vū{ChQs[s'jxñXH)vEaUձ39Nɉ+H2LHԋ]; Di׆O}yLf7eɰL%=2u+cPH/RJ$qObt]{_nM6mBu3?z7Gp(́ J:煙.( $\@5Ɵ%)Isܝ6_[cB7hbSU->+B%iVXP &ئY٥ 4L\.tg/AWOȁE$R j{m e =$\d>!q,UDI&_j«8V-T{3H0whѹR_p:-C7Be PM~(I7~/zIb͟7tm7 _K. _Rɋ%"~ۧ%oǪjo ىёEY-k]h1Ǩn:ImΊL-}l&l:+كe1Skœȟ'zm e =$mqPGɟbuju~&:#! ߂ovc"N^ 6tJЩj"{Wrc:}pM,JgaM|Vnd,[A>7UO^)dMl`~!Qe傚QgJǪjo 7golCdG&<s++pZf`p)o~POc uBV!}c 'V=KX؝o;}P60 N8٭v Z=V Qݢ`BT@#w:Z%QLsDz  NOzdty 8UW []@Qr;^"pEdGO7-7>sbb 1lyi ;:4'QP7E6[Z: g5XA{1thfr{N|v3V 0ڣ<1!zn>TT(JKr*{Y,UJciUX֊ ^cv涉R"i`h$>ywI__l*ei(uE]+~i9As&9sU 8sߝBD5t#MM6s6@[A41G9II~jIIV:b6G,y}J?;9^}208>%.?4 xsNݔQ'_O==kCnĕi5 ed]tN>z".aczZPc$Nwԕ&OI4 ;7MUtyԇ5k <?}20R}38ШuJDC7{ .rpUJ208/|n$nd,V|SDd$ÙjS5l{F$y}a .@dE;1(=(@b3A-Jw&['=i)gfO߉::}ۙEfAb6 dIԖQ!OO~/k;&:+ P6n{{;2=j}Ai6YH} %XO7"t~zU>(+>oB&ҍqQ:y֏aC7 uj0?!nBNhQOp }C!U/LN9Q~?KC Kq#'.@ES&|y.ݦcH}h>r@ʠ,6]<A&`*oEAc]2+Uyk<{K};QiKtt|Llræ2atk򄟳\aղ钫%|~BT]xw2[f$;Twd2208yȲE앫s1r}6ؓZ.Z._H`Chtk&5]-l'4Su(nb4CM_L$Rw*Ibg[m;3+ryWww|!,F2}UPIc{#_"РѮfgY*-QK L]kBT#ٔb n CQY?kgE`P)4|aۄkzRAFRcMFV.`{F]FD AU/XGde{>eE/E<"0J$ΉݳwԕRE @Y]d ?yB5Ȟˈon^o%qEV]7꺉P)kC\߷201pR_]CFk⿹:Lj2-QS"-.cdcV׫J$rT!Q8/s10a03+/v]ss5 wP'{'0* ]'9%3a# vWkܻ_2tXo20EUHh-:GMNHwE`Pqk-B_z+]_Ũ~J'lc b e< h2*-ŻxL '`? Up N-x}FEeCxe5#lWFUfͽEy+~IT7ZI''Q0rOoOLe`peY-#FTFetUeYhwO}[h%Թ{W+juP::دC?MSܙ*̡dHqW1zB3H0fuSeRcMBokFOrLU۫~@tC?2mtLBVe`pdu;8(|{3,X? NR y!O,|>,u ޜ ^.J'*=p;-S0aZ^oJA 'L+N90:i|9E`P_9Y)Kz%'aƎG W+@CF/!S8> &_GZ7 x71ǹhσY,kdYQkF#Npcqz-2wK yBi*u3A#  n,"WLrl ˹$[M8/0eof~Ft\L|Om{wkEe e =$XQmngcu ^Z<z9,Ae?DOɢ2Ȥ]I8Qign*Ϫ_|)c#NmJQ^̡sttNUMe`pΏOD`cB8!5OFс8: ݋') $Z wQ&$NpI~B;YijʛH}?%ǟ`i=;%Ph~΋BIVϓar䌂2L!glMnj4H.;]z!B $܏rbVԀΥeu3V>k({ǒ38$7:+k6 .)]ƣ_g20HYαI8$(p [q)քLm"ѠR 7W8;%b0>Tg2rWb>݉E`P%ΕaCa- <֮~pOx>۴_Re-X+*FuԞ陀dEHǍᆙG N}tlw;'dgc{o7轟^ۆSjzT9ɿǿrBrC67)t|IGnfR 兟!l,AO_=Ms-{91ܷɽU-+#U1W(^ĥ n,=͕{cnWܻ4Ҝŵ* MXݚϨA3/ }nj],?{5 L{:QN7-g' uUYx3&DP?Le>qC;K*c}2c.&Ud?HIuתY&[ ­W!94z9 1NK,!.dJ45PԊ Iު U.'b`h+:E7x#(R2:A+L'S'm6@ ͣ4pRJWxX aSb迫v]<\fs2EC|"Bx|.7™oq80 gRuZ }z@Q'wefH ]cΧS4ʺh2(,IԿ#>Qw ߇5۰d^>RB̑FBi{$KhbZ17 5[f~- _-20Uys}YO X-q .wٵ7MshrH&aʳx 7N(kѓ~L 7|kB.IR[-\'7bgiyx` DL73 ZJLQxTtge92MgΝ&DxKp5n&XT@9VO04}ɰ)JUlU':]e? &xrk }˝P]~qm e =$@Y{>[ғ-KҲ˷!Q0 | DjQLk+v7|2$Xr%l$*DFP4}oJ4Ic(/+sAn@؆яFnYYW ZcB7[}`NdUe8zAl,uVXAi~̯>C208iF:zP3ĵ21* c$Ĕ=[g|Q=7}X&e e]}30XAKicra7EI]tޣV gPeaqS:oba=ߪb nrTloOo썶Dz  NbJDX&,qTgATtj43RNa?y#lE9{L!s"<ɜjNo C6) h`0f9fQ:`^ fHݛ90|aC3O[cB7Sr]6+2< fPK@EQ[(/j7j9jڛAk鰄!jQwkv)WLgz0So=BֆY8Vw`#UɋQQ0~܍v?j{g)5N#顫a&n -#u_6kBu7 tF|oB77c/f#pZf``%Pnmbnv)[qx.@KG#/k|vx'qǪjo Y&IR*CowQQ ;H׸X:iusqb_jڛA5W]sQy㛑F3Vo2FHVg_#IDJk_)>syse#WTH-dJA*rIz*OD$?㉻20޼uaJpP6lc'2f`pӄy20qK(^>YoIcNRP#<Lx ~Qݢ?^=Ok\?\97*c3YNE`PrnB1Vov4&W Tǭ(9<$ymK,FfPb i"eK{Z} |bw["LC"5Քg1zNj5%ѕ8F-Rw3@0߮H:Z'% ~ _o gLzp/@5-:̖] pRMƷIT@xfyWF͹='Xޕ<D rע ^jڛA}vqlQ3OGi/ǃa(#u7GRbuRs qM\Nk;~堭jڛAEI]t&N*lYn7mK<g4I-hm#bl$_4&P{X.{]11'~NW3.bml:sza* wz9tU"K7LObI32A!\]ifZ5S?E &9S <59qnR1 cM"ش{iĘ*O Њw9 ?'rYV % ζVQV)UjkeSQBAQ7:}Q62Va$^rI3_CiB)8j5 'ggF|(fb/]rTa%ʔ=3eJ-/l'4V` U.J/")klip*+pb7]Vi+֕ə1eJE;K(<1s.NRr WX'DЌ5ozdIJ20<ʩzG$ N+ KPZ4΋}:۞2?UrU_)Pw%{Z-ȟ6P&]|nܟ۞?vֻ]{n[𞞞 -g=6svj-u^Nq,?~}דk~=@[U7FJCIpK$7udo&ZЯ{H.e Nn eTΘ_1"($ ɼKh~\jH'(+4ZOeGV٥ȧT5̇dJvM1KyB ~U,-AVH`Qe>s:R?<*Q[Fۜf:#0bX}%(Pt>Pu=7eUf`p7I(~y N-iOډ@l7J*HMX{d[uX+'@;܇u߇ x; /akU{ﴌ{11P&މWJ쫷O]8V-T{3H0: ^y YӚ0HhɰIx@xmz74OsإIo]CY6ޗ(1i'[~}GbYԼ1$N٫@&_dZ]]Jbg^_zMF|eDoFFV;|J7P=vA1L3xvdZSu-"F: XcB7SEVVUJO9i90qIFDX[cB7S>u3Hrq[Zw_)sjܺ]GGҳ"n֝th϶Xּ/Ly  >"d;ŬW;0v-T{S80(^}BAG"XE[j:m2|Sz*SCۻ'KoWג^yV'DoʾvWnF_r_:|L;XpX6k\-ea6O?bnGЃEI[:tEt=UN6jL/"Uq53oQc1oBQ0t[(u.q"&wdgxy<޴4ͫY4y_}Y{Ft$,bn_ob2>쒨'Sc.ѯpϺhK9s:lw,)ӎg*\k:0AK  v򜂝5.ݶo%7f^BF-.ՈȺLVXz B~RI󐟎7ۣxAx=(MNxČ}X8N:IScؾko :b{?JǑAV= Fʑs|[z#xAi=uv!%򂮖X6pBo['OZA|^J(d S:l2 @?hԯ1?). W&؄hLv/Fd?vSnn; ?ctyu(w{Q^uAHr:rk]ExTܗFjwcnX}~vN='XÕW(sƚV/+TEvK_Pf\(|g "!t7qCk}ޞ)5HW>񀭆H5KR-%N&iLnCS_O7:5eu6=q*yzz'z gƶI0qԢriSDɓG{\a HM޳NnsY-l'4ӿ ѵGegdpX;4a18ǯHM@ >3K3S՚Š`Y/\='zVqxL[ l.ܣfU7.J""bRAQ v첩4GE(Cp [f``VLPUE;ƥ|6f5bE]  {P9xi (!!%=2|Ǫjo [-wKm렜#h2k"U7ZFԳ:pD'Yk;^dWC'ڎsz~.4j,qp$4^`$e`p7*%NjPο$w Nuާ7 {1BNѷڽz4%8-f`pJ9ぜCԸXc h|yD_ z sSP}L|>;oasI*PHU6 nmcGV}$?BgXpc6^xZSQ~w{N!#j [fpQd17Ai|jb"͕ <ymUf`pJ0'cO3NXXM`0H0|<3ʱHmUfadH;B3;Q/d^y h@mL;8ܑ@{#qRt]ƿ)#F-Tw@0u@3;=tj!ngo;Ud[˵.ujcge/|68 !~Bdy>h9=bF8lgYg#$<6)u{O (k_*q/K͗pNDx0}Xt ˮ` [``CgGG8.vq帐D x:_YcB7[x_z._M_5]`-Dyqw8[6n:(Q 4 KnP"ͱ;9WPQuzDn/"I%GFM,/ PMl֮ۨƑuʐ@kJ}j2i208 t"{^(*~Ք- = hHtIMyBYdw1Zv3Iɍ>%8-f`p}KPT9b" U 4lu ;ax^AO2F$F/}&(EٟL[ bBفkڛƁAN@і͚"|)/e>l)Rch]q"ɤP$( SM~T7:w謽[sBg?'^"1e-_Ћ[T=eHİenC"Pt貟6gwa7}2а^R7"0(v}0$zDZ'N`:rܐ(&kL$KTŲ`)U,ǥΟ+OLۡq]W~6:#7ac!~[i'цn'p$ Y:6PVcvg*#ؒȁu?A6G=.ap>2) yafb.F1g-l'4__+HS&^ n<9܊=%媜%8EjKp,Ch~€5T<ƽ]XZUYiCO*zZ{6GuW5o*GH|EV)66435k_74lhfODTjkz6QWvrNcOese =$YkǪЍy?5~LVXjo_:#I7'8 #9du~3Nɗ@2dĕLڴ8V-Ry3@аŜ_CND^eR#kGT/ 8S/cVJ%ggіXAQz>۠]eԕ)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$Oo?ɞjAA=Eu$U208ދ~Ťg<hSe e (<|3ĿqLm@#NlO $XqZrsOR'E{(M+pb7[Փv4դ+es+hH Gj{6_ n p BDQ@@$\_͏NEv(!Dj!OMAVo;rZTƛ"o~3Օ[JxE}?\HiJrx$n_Dl(g^(~=K6'buVnXVhR~[-> v8 vwGYfmfiQH壛w wbFݑw2"%Rsqa|8=^)1ixE הޑ?pn8!+rOHK0( SA.|}-e`p܋jWeVv2uS9^.:wLLVXP w뷀 1d&~d C`~Kt?Xi XS^\E{\^4LVrk<3[͠ɞV 2{t{ᆝ 0'i"CY"ߌ>i\1<[ f_,zύ kTxbw>G9DyG-gS2r~[%-Pp܎T2RJ,ɳ9w(C-T@00;G> jsa.܆FVn]z[}T QoIlF9N!xB?er?)*}.a<#ksOXߍVC))بA/3VX*oۻ$.3cL'xƴKY@ WN?E"Q m@WRi8y9VXϚA |TS)FwДI- h+pZf`pweuagR&̑īawΉh"CYcB7[Gq!9nW~y@ ܄@.sZ"]#@f)OHVxPqP@H3ԋ)޵0qdʂH)!ka  L%Ze) 4l<̚Il7UM :YƯ 1  lIӾO9}w٠ n3I =?+mHPܹAdvʿ.}|зT 4g}xW;pZfp`PsP#zkȵ8<+;\|}rWޠ2аqR\}H'C 2Z[ &̸2? 9E.CdS Sϊf+)i%8rr2081:69*x"Qx A; n ,9(ۅ"9<%y/Xƞ  n]>-lΆ같 ޕ}(!v ulO;38Y %*sp/Is_K&:w>!/Aμ0Y^ =c{'ةޡҍut3%. iP)ӘT2IMŤ T7:u8kw(,Ǿ6rE)\Bψ/$zQVkRe`p 0) óz V]':/&:wԮ8RMJP ` Fp1SgN)H[cq4tYޕ9c;v*=@I-|DG<Zǿ.D*7%[w'*m0V@00)sb2vQC `V4ڣ ]$-shyQ@YrJwL 3Iv,"Ď{eUT 4lfQ22bE'f.S'q0hhAO2u4}o_*2204;NO$\a4xOC4G'eIu l7` GV"SYs ҆; )~ 4lԴZBlaؽUe`pjRɸ"_33wYHmϨP!k* ~z,l&Nbv ;20 Nd p0Y>Q5LD'; gXp*rgѵz Mg؄F?{ifR` [``jX*^AYF>jhjڛAߑt&풩#Fo8Pw4;ty愋D}4f47208{E|tX?cI&ߚ.8__iGsU盗@.M*z^k{]476!aI5U؁.Gr*;j e =$ܰZFO]\QJiM_z^&v5 fd@~zUy{U$l<'wcD |%SE #}0r ${faŲ1FiVD9ZUo51e->Q 4 l}6D1wā 4tKO=ጧbSܨ ؇ '208gT^q޴JoMe`pb-ryӓq[߽ u"g]4LTtC8-T~%{Le~8Y%§c㼫˿v܂d)Q3_|Wg$Doѕ8ð3DX@@) 2znI{*]i1m̺h#5s-8_[s%~+t"=G]dkKp,[ փMHQs4_fQIAJ?׌ή]椸ay]?3Gc40qbEϦ-ya8V-T{3H0c奷jN8Fn[bm֨En&ϋ=[f1#2_m6l ӊsKspꭽ Qa!S6sju5j6`aal=Cc9%spx.nԵdD2i8&op$'d)T\)=rӝW{fd`ykC#9RɨH NgtDJOQ-l'4VY޺_LprW&Mb$ _mm CPܹچ6Vnz G\A0.v} -4IqOQi^B4>R&8+%DM;Ne e =$m㯬w'˲㊊" N5Mea88YsguMU7$w~Rļ'ш1SE`Pz+Ļ+xO&/Y<пo޻E"~1<9Fz" X Ӭ᠎1Xk{w5w,QLϛ~\^FGtrW '4EuhK3A'96LGM4Ľɍ;L>58t7U[cBOh gF_ BRyCVJ1dl8V.]O=4<6xQypTvK.s 9>gǪjo ~qĈwCp.D=~+eR[P Lju[9K.XXFe-0^a.^KUyjڛAxš0Y@jVljULZ}q8Pmx^< i£!4JkU  .1<6G %;*/} A>9EWG#%_1]Xc"7 SRiٯe~xο#8Tbc Ag'ID^,'߀Dz  2s!|Ù٪8Υh+pb7ӟ铤_S3Y.02@_DНağ?%TR ܯnv4.8kDz  Nݜ!gnm@i<<ټ$208~jgxb_޿R\ +$tD +".^}Re`p2%<%XQE#tw)'G$Qy>e`pS>}~ʄG>V־{܃q'S(•%8-f`pj]P$ǂ(jh92XA<;ZalfTO:2obTg+K7Î4otFZ̓a}'c"tR0W2o*0?6ar:EvϯXE|ðCjKp,[ EsG$+\G20aNU̝W.1pW˸*Q4"{*z}~xT}ny 9L35_oK5h'ʮ}MK*܆+H:a)> q|.=,7\qМi!UMZU^D6|~ZF]UJjYߪ2аZ|{V[ZS\ (sƽMOeɠC}irMsF֎ 5&8YcHVgcZF':bmVNIjOx߼20QW.i$O)%1/Ks&4tp{9MzB3H0q xd;]"i)ks_n_dp]rFK}?HE?{[cT'OL' rz=4,e< H=~Ȝvr?zB2KY=-1;[;:ǒ}+> GUڻm* Skw&? F)dɨ[˨F OVHV]N [¢Dx戒kU1Mg9ip*2P((˿)eM32/@000K&' )o:~*s39zVͭ}g?]g4MJ6SkKp,[A8W͐<BN Vm,o$f-[M1qu6zH:v\-1:6_A~8]waHVG3w"G3O+-q_J:$iB \P`^`(>m VCp [f``ߛ_hZ1KyyĈIٿ_9➎g7Hwg9RX?o6,!h{,É9&+:k|A!]oY/vz}.Y?,b(f6G_~n\ 3ENɕG#sx;n$De ,;ɏnt9YrÊ#h|8B U{: +*ҥ*)Zӧ| .z$6jMh,7.dݳ"AHun?>nm&_4_{ p4X>3,gƞAEE߳EHv n^ݷ)d*D[^>bigUj+OjwIb4e5lv@G)b׫6jQD {.t]%B^:ܨ7+~w,}<O!]y|fZ;ލ:{z"Y3hRfaʚgjڛAlGpJ TgbIa3V~Kָ0cƲDc 6͉}cuY\YeUKx|~=DZgr|lXup+Kp,[ rO'k*P]q항cXy\gJF`bu7 [{$SW)3ZFx. 9NkbRGINt5 ۖ "\K[|^.׊[W {aJ-qZ+T~!n}2j,pf )1b*)Y"0(22T^U,>%K5 r;]E`PVOQډW hM;$" .A 2TP(g_; K,/#3@YTtsKG:Q(pB'iH9JO#Y$,/#e e< hLIs=m-nmGdENrAr4S! RHR|zG1g\?5V2<6c65{Gu lٝ͸ek򪢺#8<1IQ,XP*Z_~NW3f-Tw[a`@! ΁C& EӘ,*]o300 Yuq۹V8~zk/e΍:C7|C2OJ@Y,E`Pcy@mipKTXaF.~aqY+TYcBOh |p(OٝhTؕ ,k}A>f>?b \':2BI$X#MpcEe\F%m,vZص N2'}ug*49 E,G-J>He*I)YzB@vlZ#,R"S +}J۶OMH[QzWD~Wܸ⎜bed|}=2+&K6kBu7  | 'c  HcgW j*:ټD8yO#?|fɮ:69 ~7/}2,u2)LXcdp@ oWkvn8>9OK8mޯp+DžMHĺpJ;o:Yc8/FNH?{l7+п^b^&ޤsAt_ ea<``^qt  *3֖eN}`*L6>_C.>e՟rw]$8_Iq DK,XUɨVR8e$IH3zRCv>s[gMZIBHhjR2SXA- TUe=k=O]$yz^u?J>#ETUHЕSUoџѳK(Iεh208BM"JU.m˕ٜݱXv6y%1E>t?p u9G|c/}gQʱj16)6{.іXA+JkPeIN*9i*4E. S-y+;4ND U3Ӻ)e ='':׭&.,t]t`2R$bES-L,LϮPMnonbk^E;AZΗmV N2L`G?XASv\DT #uL&Nja̓C`ʎ[ޢ3ַ=Me`pkEA(AK-_R͚b7[|q $:UɓU']o矙[*5jP\>X"O3˴iWXAsD=A0pnNwԥ71jiߴQ]snq%@5/Uv$gsCI}k=~ 3ɴduh?E[Pu*Ñ.nZcB7[ $3I` .]OVf<[&׽R.7"^Cp [f``uDj-cjTُD[ȷ2ufNg Μh.K`%0TER=6C;:20ayb+R#20MZz.S}<Y-5ݖ[c' 'V_=C^G8KpsS+rZ] +9nX\q!RhoL<%DZ k#WTۣ%t?c#i6P{4[7fwoh&6U:1nti8n* E(05(>gCa1u8U9&tbH %+pZf`pFqdV1y Ÿh8c!TW$< ܷJ&Eem e =$-c?ˍ~LŜ2:z׏8uQyX<sY?>#멡0 >ÍoZf n"܂)ߙWO=$ex^=ʙ2Kx5 Hz=A{LG_Β 8du垪_"}]_ҏiuSƤ%--9]%IQt-}Q;QU݌:W/&9%'J6.v#m)g<ټ\$R\)rٝiz j֦Ejn%R㺤5JЖQOs[3̱ 1YJf@F={Ru(|q+9YxUy<6ZCp߹B+#=Q-VMU|c9n3ϿS۠<-a5gitv|a 4 L1IOg2)w/i{y(K*>rXMM_y*9rQ\c_*oF*1+;P?#P_l`'a gR?K9(Ϝ3w1NV)5^r &[UGV?z YSt((|:qNʧOa>ܸ֭6Stqst+#pZf``E $X|≓oi<jv JuPXhDk!:=3B ~-jtQj: 3J7M2x4?J*~K/"?:E`P8×sS89TZAN#[&n݋ަ a ?=O~yA}L=W|9# eDCb[^UzdzB3H08ۡ>2zv2 cH,]==Yɭ`'+x,p4L")hP<^qfwǪjo f|'$Dx8^_*#+^>y7F!)[n&sH9~\] KaMy7O"c+])5D%8-f`pE0-g*f{*FBvZJ2ߴ)Q< zlH g9Rϩ쟽jMb|[{ՖXA[c,Y;)2а8cq463RTU',(z`GsT`Pܹg4oڧW55B^Kp,[ 72@Be, d'?P]4Wܨ ְ2?SM%'O)5|K]K:IuĘa-#2ү0!~[Wq^J٩g~+oAuOfKڣwvc1 EGY NlEG K-pG;˭" 7[1'QXAߒ0߆[y(7?UVRuR<ϤvV۰l?? />3XH]6wE9;K1vJrE`P"ÖQa#.Ia.IdƩ]^;d e =$tL7M8pK"08c< _}8y@3@аXu/Qi|1k"U7ZnsΣ9 ϖiG}(S2ǣbQ.=3dBOwAawEt)9W_Q(̎DĺonQ,cC+"(1z;xIPzL" ζa 5~!2,᯾-f~T7~Lw8:S\~mS>BQfJk2Ik"]яU7Wn5lP/3  |r렌wUPVXP ֍Bn6 mm,U NpgI;J<&!]XEr,,'?,g~bمCy}sݻU8="~\55 /^XzRPΘe2'NOj9r)o2Tvq1Ynhۗ셥wjw6spš9 \ug#*d"0>X}vϛ&d#N{I^pU R)O-7~ģ Qm-qCot?]HWEAhCkV((j<٤$؃\ F](B;{n֦20LgWoNfLRxM$zUNPwxYufs=m_fI퍂ReStU  ; P%=-UlVk$'uO:R ?D[EO'rn)~nù"uv -@@Y {I.&E6oh`t@Ҭ{2iน>Fr+cj >~ aw=w}TQɎ9RR*J[Mww208`"ʳتQg->q*)v "mP?.e`p.\溒[1zJ}<ܘ3-=\_-}"Z=J %7+L懧T[ڪS!vX`JS (62IT20;5RpH vd^q).F-¤@Oʹt&< wʫ΁S=[ +D4a#vO¨cIrx߰` 3^>%8-f`pKXEW/D!,22?c={j@+ҍa]kpeiNU %/.Q}uȓ@_etLe`pU7Z}}96Y~lP Y oT_}i֬b?)3bB[So}>Q208b ԬWRfR/t.Oge/ N6F~O{C֙gKd/( ѻ"$7Ϧ420_--`K+1`ߦyW` ږ߸똯=%8-f`phE/WѪi/l6  Fsz6{J.Dg{CNy>]ߨ4mUf`pdU -1-r2}2-VXjo 7F-ۢ4jZ+cMɲ3C  NO ZY'L= kƪ2pena$ ݍxRxpSYbo:mYqjL'R-3$F3+`( ,2˰Ba#|<ѭMe`pcB>hQ8#_>uB^5%ƷC6[EA1uj-v;Qb"$D 1 ϭoYB/]1*-<}_זuNtg>-3ڔOQ  hż[3Uȣk%I}7VA=& ^^n am֨n?̿` oSDjw:g9|}:a uoL?~~=oF7:1*~|~|iBبw* F*`=liAȉAFF46bvOQ!EtJ̢/E`PËKN܊"Ŵ>. FAL|U'T_}uTCz_S3Q>,laU,S~W]CdΐCLȪyDEl($H\zy.\C3E4f $yr ךHNYcG4#2#gׇG+Ǚ720WEgosOڻT[BX2عsD{LL%8-fa1sCVrmew3zgHs%^$208q#*BZ\VRK6"/a֋89R<;\W6DurZn|E2[7n*IgXg'4*=4 ԫ2087I2`̚ AHƷ2 -52>T5\{eFLsTW7DT[zU唈E20iGxnMoN";|qcTl`$x')+- 7E`+sгo=cB0y=VXHAy5$`e<1l{9IM*:lhq#;]S ~>]ݙIGYcBOh '?ϛI&IB(Cm!OQj@.±!pG*GMgJ?c>wav6Ytr7ҕPYZ(yP)RV ZXE4ҧJ^PGGz4w>۰'h!וaQ$zlH$ɧ0ƨEnStt(MZyU$И+$R{^cXY&cx6SvNWꛉę.')Tn"YjڛA->K#2&wU &A gRo,Dc~lԓ#y`lBG9q.Le`pz](ndK=s1097}ڰEo_Nh.xtMw>©ֹm/+¾I*N,ۤ{.sJWԖXAEtYjđB6ɐX[cB7`U.puEjwv_M#ޱު"?_<^]be@þ1uT7~-l'4SLm9d@Æѹ/ht :gb$_X hKO.ӔQ@L72‹lIJwP nH0ۈ戀1r QaVX5]98+5S9hw`e77-ť,UK9$>`B g-|ehbT`5{|a | )3;#VXVѡewegVk0ZmעoґĚ1/O =V>93O=jkվkn)uprV, ctᴱ~[/\O8V-T{3H0uip_SuKV7tM?{9 N#̕v/Ϗ͒+?<_,=$\?WqqqgIaڮ ,DaǪjo 7: qѫt58hHF~{ڨ2а8w~\OSeahT=3QP ZF~-q~X_L(OL)'\ ^Qyq?c 5E8DyK&XvwOdh%䡟 {<)$h.Tg}nXU(cl%N(]7)3'aEfvé n8z[ B6=Fε. FH F9p#^wG {25[C(-r1 j"VEF*wMfȎtLGbI#aw.+=>M n$]i//t3]w)VS~heP/*F&ߜ i@gFf'>(y20@?t.RmB}JʍX+>yB ݽ}iP7~6Q]FǙT'wZ~J@+K5@[IK3؀Ϩ l;te<Uc&\$`& gL91rHFhfnս7R^jz$̌-e>˷5W\鍤wdeX6J!}5+ekyrl ɮ1dzxFܘ5Qea{?@u]XpktK5u Nhf= Â7HE&c\208q_ Gbbʜ _5_ǁrĽM.y@3@аoS2I̹$ͰUDÒvWe>\}4 4 0C|xAU{7oqbA=.|"dP%1'YtW&g.yeY#%s@AXv^^__ h{y'fҭqyS G5lf҂>1 N Jd;OTjʛy6 Ǡ`$-[W+pZfak?Ai8m9Qe`p}+[?%V]*nr 1RWWD-nHxز;Og0T~Bd8ZNV Q օ=v0kTCuW *SzL/(G5ԙgCE4ވk$ s|NfOtHql!X]y(1^MjH*Cdk+pBW F~uƎqR6s=a+ H'2&Il6YF*%zgTOkD t?qlVXP F.If~v{rqU{t 5{p);%+ B8aur4%z20g[d&x YS.ړiQM/y.7u`¥n2K߭z apx6B;񴍿=^Q9846C={݂m՞0YU䬚%xce)XA10jPc|΍52(NyT6黿),#dkDkDR!R(FiÝ&g,D`԰"0޷Yb):# Es)s3ۉi*Li|R0!^B=JrLp; 7 )%S)WkwYZ<)\>l`,/3]KF3e0Iso/+f睙q_o<Ü+fw@Zhܣ_˪u-Y_uŵH+I.{$yea ^OV䝬bD{rOkJ| }t)0Rt/b $Y:#GY_˓|S1m84ەl_{Y[Q*zӕkl3Մ6if5ͨNA&!ZSea}M1O_,eH8Yeɺې,=$<ڂ0͑srrhS8aD[2BԆBe,tj 4?-i(Ep==p-| ?̧Q*0x% \$-Se`pO<ŗ#l[dC>joVyg+208ٖ!rRLA%a154#_XDBkJݻr4 /9*Q6MaNe+"8s;ۮD" 5v3-6 2(K3+tF8v@z܂c20>/cf쀻˶NA.?qOi2tPG1H5'Srv[˨§HU,ZVHK,j'*9Wu\MWC[Y6eX`KdBgK)/Oc> s0dB7Tk_ f}meyI$r ՞ NxDDŸSjf9zH^9ⒾLCA208Z%J9s.ͨT&ܤћs( 뿊ZڷXF=V ut`ݶ)%$y+ܦpm `G,$ uR L^ZW\cT#uWMl$`y>"bE B5]R(`i+pbWLK9ٵshX_*0׊5#e`p Ѫq6e`p2wӽ<];|[zZQk--!w{i^emUС208}X[R6O{ht/(` jN +shM\5Qф{B$M|3L]T Q ]5 L"^f*(:,S\%uVX*Ӧqy=e@F/2uZ3lxӽKxĹ}?HcnгSũ17:W:fy-< E"6={K4Qb㊂M~rNRԼT^xP\gR[c{B5H08(zltt^s=㞇^UG ] IP8/4g] R=8w{ 4 Nb'0|*P'hk.`}Tg-y2 0Wc!&FlP^ ʑT"td!mMH?%z6d-+31 BM!$R;aڣbq-2y,I?=~s"~_cpXPP1 g,E2!+:}.ƽFSIF&a62аntI2*g3B.4jQ ;@߷8aNl~] J^"gd{ۄ2ꐹ#"Cg'\0Lxz.2kTCuW  ɟæ*D$&^>= 8Вbvp`ğ亝xauOpA>}}DcTUW8$6΃{92=~7Dlq]H:rqlx.h3 /] Sǧf;a> &iuDVMR鉒O^MOۧ3&J(&7Gᦉpǐw׶ N)%\SSlj F!$EVQ]_=p.bʑr^er/ B.}3}uVN;u=Ylpxnjf!DYcYCO 7RBNk~G3o?V(Mġd^hI\R"1,#&sz-mNlthXwt1(61B&enːqg֕OZl}̖rFP=Pno$t~'X_yGEk_|fgjs1z9Q7u[p17y8D^D] '?~*v3Z/k%766_EO,x#@&.a(p=/y$nY#}NԼ`dh%5]˨Q\vV\ވ2Nۆx.FmB+GqOqҟ)m/][q쪠d{0s-'TVIx% OXMp¡V72{'8VګAW,E֨F Wg \0##}s [&#Q[`qh5{}\ sݧ[]:Noz=`G ؑ U Qox[qt3Ȯ<"hy*ʫ{ ԛZ[NLn,#&)2ƁF'^CS=ogeH '8Rw(. {K1oҝ\m~sܱ+KMaTz]wfsh$#l䞜c1~' g&>Boi208`lg)jH{c<=f,hOp9%'/8|z(RqR.zH:]jE`Pj5ZQR'O0{y9J_=i*} Fޅ 1+!85R5@0n_Ge8I"ձ .F9˝]PzfIٗSi~e`pB2wG8 hц` kqQN\Wo­ 4}_L8Wbrq4}c'w:%LLNM׊!85R5@06GKgZ6Y 2ƪjb, *Ғ~/k[$ _[cU#W S/q5m%ݰ7}?/1Ĺ T~|jF߶brKSej~-j,Fdk[uNz\bd曶DzFP 4Lk;k C[Vu!E u"wyv g!N2: ڲP  [%4TWJ\Ƥkwđ*V{5H087aRj_i#ebm"V[Voo;#_ɸXx Ymm_j8b9᧍1 ]  L5wޮM5wDZ#r.=FpC剠UlLh⣭/QY/6VZgj5T+䤧vS֙fLvėǑ?+VyVw6NK,BeF_zpp_$gi+pjj`p>r+LWFzرظ_XjhTpm*GzCܽP& T 4ŧW+kZ\X/n~O-tKe'kW0BBطDiݺ..D&D@Z Lb[jj]GVWy񘡳^#{ւYsRe`pdu!,ټls>m[otoe{ Ez/:;O>Z;7=T%$ i4y@5@аii* -Mb !NB<|M9SA4/%3g-Y,Itrc1ʚ>Z=}JF.s8 f['?Dkc e;o9_[NCxr=_|G%3#>EhKߠ' >[{0/CpU8E":?ebf,UPy Brz2cz2giYz ښ1KAj/;\=zﭐ(yh=kEnlײ'95XcYCO 7{?nFsY#3pFR5 {MNTe2S*9\)3'H`@Yl4 ֭4\"0hv_QOnrvU)̹Gq20s:qI'fXd"9P}zU )';(!$ޥᲓytjEhb) {zm=::SG=Fҙ%p:OO*VY:OpՠnZ:sa9D^7TONO wb?*CliCB0R:%D ln"&SG1zB5H0߰GVj {>:ssp20gi:yqKC:x208mSWD^gZ^^$~/oFq+GoE&Q1[,oCo7X<-V22{OI55>bCwv\r2lnD}ʹ[}~5c2uWcfI;N'q&%qY6Iz|F/AzO| 1{Z{n Kp,cO DLyj E3*Ū~0(F? Σ²9s Xͅ7n8‰~8h'Bn,k E!$!}G:$r*>t%ڐ'j tDB ģn'I[6.yKT3208vάFL +?|.t/;1k|ekc,_6'sgRJ0209aOoA*-[[`J3x$H}jU?HQ2V5Ry5@/.;Svre|Q62ϥ)1M{0՟"0(Z7ȀH2FBlPe`pbp~[& ̤-ԪԘd3,h6[ANف׺AfK[o$5FmUjauS#=W9ab)AB-Q%f q2ǨF6q,?Y\`v8 :h'N-=Ir%"*|<|a _5 Ll:1VoY}93&! @Q飌{!DgS]+pjj`piTGX*-a]F`i+QsKrA"q42&:C(փ8bǪj 'm^"QJ.{f-=ueU ^  n޲惾ﹴ1߱`\NE`PVۯEbok(^Yg;5d6k1ڰּ[Y^V13ms'xBC2cT#uWSEFFwx ];qhɴo ި\Y,Z7ӆ1L[cYCO }AwB{ܶ+߿$XQ =yޟǪj 'VDRKV*BƄqD>$r+n"{Wd\7yBJ}?05q 3mUT^ 4L=t8#s, 5d\jB[{Xo!9f䚠>œ8}u2F`ı?J43oDG*^cT#uWlnZ%\Σm\'^ w(㦷W+ndʑn,wVFv>~㸔,扬WJ$8 vS07F ~ $ǹI8{dGg蠜!uޗQ>F`j``r;zx~ J&ЎK/壝薍'Kh*75 K4tS^~ n⾓ﵗTk΅E`Ph(p!s\|WlpmNtajV[1Л8,O'Jy8,O|]}50Av+]zno̻(v\SFDzP  NisU J/H'0M7ԙ?/ЦFa/R:2l) 1 ]  l^:Qp W`::o\;bJQX%@ä,nΞQƹ> b|=×ٞ{I< 9+{r$p9usK"TorjH9DT e`pq B.$?7pa2[\ dǝ12 4,I BTL*,AǢ$HsTAai#;e/<$JƁ<¡ -$J†ip &E6R2k5#kⰟDjO4NDZPl{Iw3.TX];  $|ct@ og)16Ap\l<4 YT]gK?wqIKB)SvB0ddx $3snt\[Va7kT`[Ttb j f>~wQ8Em?Tt± JhMjiDK7(CJbu'7Ue`p / ޶ ٍ/ȁc^Щٿ#)+h+BYAǪj 7= KDZz&rǍSJBax6<*o%nJq?8 Ha#E]T;4fǪF*fvUit4}N0T ^`YcTUW7Oƛi]voХÔ]ǔPvmG<r9RQS *cݏSND۽B'%85jaBE on^?AA6DP:h;}Ų,8V5Tp{c@k/2A%wW}&c?[YS\J"0ys47j)U{*9~#O“Ǡ[.+~Id%.r22&l]zePoչNB2Uc?%df2%ɟ.pH6|a <ڙq.ݻq|t%{AuLm]Ϻ}ow|GʈbJ끪vw灼u'5-(Ew7LlwYՖ\ -/ER{mCa zB5H0yjt<ҝO(Mi!Tm++,rbM8{C>XRkYCO '|Iy}E*UJsE.7gOڦ~V[5rqGXM=208bQK5\z08q44/vP?hiKp,k "c\|"/8PU"4Ym"WN)j>ߺAM J[cUCWxMS>.xR|8V5T{5H085=Һpz ȵr.Ua(eҀZ PGeq=δd ۋv< <,{&L@PuMhL{¹W'2n) "0(JG ^Ζ/ d [e75q_4Ⲝ /Ӗ{aۭoG ?=mְ/a+m/QѸNA{cR]7=]lAf\QzO+Lk>RW|wWr}sm7=^CL`ӹiN%dsHԢl!βh}[]ǁ79RMe`pj1c}r!9Adޒ';?v/b]p)AdOW+znSB-j,¹35#F Σkp}D݋3Zet6&TU[9eؼ'9Y4P;pٿXuWXA͇H++cIzu !mn6~'mGv-H|^(pG'EJ߳P)EĹ8V5T{5H0yY{B!r!Uh:{:.P&w5C~1~F cq75E9<9Ӿxqz208XD vrBmĎ\|2pio|\?E8[e3 "0DŞڥzU\'R`ZHhKp,k ളd[sR(`QPU%.I?qߵ4)3Npy <:yN[Fn>0ya;Z'Ii&&)r8̆/3:43LO,u3Y11p;\wS8 ׫ Su98Ye_T?1P{[}#imZ8Ϝ`MZ%2q"0)( X߂6@~U? z|^GcE Ǧ&cޒgm@9f>ͺCff3SIM5bDzP  N(ubÌT<9.m"n$Q N:QFHJ'bUDPJiz3VXjy*^mT0ZS$nّ1Vj`~\La=DɸF`WەTi;Z ܏/u /t?o%-ESvtcm +iP |Nv=PEF=hPU@e959EHmKi 4L6hw񊚗Nky&ösl(e&r>6~$L6E9J)<5r oEN'C[rzt\oY*[ =HMNSzw0kj ܿ| _,3W(z.:#m)=rzL4dFz{M݃ڻ^k2'F0k q-*{K!&,z`iUea:'s0viw-m;[Zʽǫ@UM8ڝygmI Bν6%Ye`prڻesfO- Ǘ6vrNi[ e e< h4SZcHCy[y(Po#3m̥in!K{: YcP?ܣ1abg.|Avn=$ 8|*zi}t\_5ˤ \2а,6F|Ę*C/\joѪKNz="ޓHe%>2uW yrJGmX@6#r+S璮-<۪N,9P޴a _5^TҶ7^ B/EK?`:BJMګAM%bjo!|"|WFwּ@3xcw&Bm¢_|t4-샨1]ކ{UFl֨־c1 Z)2sq'Ss Ŏ=kz3罨S ۪dxJIK.iv78 jts.3y\u9y@gJT-k YNJlFUbs{rm TO.LOҏ$O~:MM[qo$13Kbo+!*t*BHBh6{Q- OO.1S;{^1'UjjFB| 1}5~kO?UWv'Bڐ $^p 23&"0֛˺Io^қ@Oy1AE{n& 4%lI 1YcYCO +od`,7hlz܏3eO:y.&JmxMjlU'VT%mu[IDzW{FE8:8ۻFګA~hc Up-#d6~E#P+١pvFp6{ٲ8xxLܰ4xLߌN9 #'V;d6*+ n9V甈\/cInI_[P Qr0f 8cC' |'Y*L98ef5um {j3\av66ƤЯ׷60T}87ggt1M ŝ sn"duE+ͨ$U{K ~\,qb|~wK(=\[c h rU 1uIt"Ff*d^mjC;8^  H$&;GtWVXj GVy7j@Xd>x@0p͍M[c$ ];ŗ{Sg%S3meUZ6̈́;/~Vt/6M[ann0܌swr*-p!G*z+FUDTi~I6yBm$fė_p*/Iizr ->*'O{dk(H{*rr&\}f]qM\jy)MBMN ^'DnqC MMEޛ\er4Nː|spӢm})؎-cYCO 7/ 5k,?o(b#sRLaJj2L NiXR^Bm cLV؜doDx(RN\HJ7RO}aov 4wfFj8QM5ѩ0æC8*z ߞEt^Dz4 څTuܳN &~2.O274H+2L1C5"^r\}KF. ]dJdu]G_FKg$"+"rZPEAs]}@Smx{|usgM&:IHrlh6kXCW 5c^H20ß9$r$ʲ f.}QjYh'c=(Н\+_!R{ n- u"qtI20 مjCQ߂Qeނt粭pFp(!x&dNGp/DlK2_XCץ Dž!/$ԧ"ImeB_]29|nG(HfcgO聨\c~T{N=źψ%#%h)[A[{큊CYcY#/=cw`+/LjP`lȕ{9 E`PƓ/A]n"u4yQ~d#ٽE%3f5Twa`@ZjaoM5]5>:w1ΟO~1I!;;-2GE[cYCO (VdhY>7]33?)-*-7AveUT^ 4_b+/Q/ZiSzȞԣYlT#E1+b4O\G%R/b˞ Ҿb:Z+` DmB'!s'4imChQ"I ӆ` k``/yÝ0bCYb[*@2tXpe2lȑ s"l! -CƠods|QNvц(qҧ<F:Oyþ%85j`pv9B_]׳}e`pbnh-׳ e`p`zӓxV%^Za CWXvXNތS!T#sP%m!02ڛ\Q}6nM "p6Fwot\lE[Vj WE^*Լ&<"8VګAij/ ' 3V/ ګrȲ61IwYNw^B9l$ {ChX_ΝڦF]x(̳@G.V&IIRms*joĴϳ%85j`p.ih  \DчHV)ńIYcUCWw) {)Ai*G\N2KſNk` ive_bJŋ6bb3,%8'TӪT5g ?vڏ~3,w??~W^ f ߉g7.ZyqjiuhY'TvpS? /uHHrb208vfvZ!R(~Ω }:po({G1g N}ϵLDQ3*ozzVU"zJ[cYCO g&VD?J(T?QBv,Gȍg.of˭0\8gaq_\&OWa!85R5@0G#88{HK^m<2G VXP gu[gxOG!4$WOC%O /gSA}Y_JnoLe'a92he`pd)af:*Ď6nh ٶÐe>uR l9S7QvR'2J!# Fcu篷8Dj{]ӹ3.1|RyA7>^(!Ÿ1O0RwulSE{H]Q%kd*yȇRhF{ڰ$TUd55*:w9#+kiy9cGʹ<%t(,/Zb-Ƃpya12+%fپ.͡z{–x*K\We`p}tݻ%7oe`p%%*գ2208&\e?w1x"GUf»Q%Y1<%@[cYCO 7{E3EEQj4ɦ8}o&&(DqhE>n.Ivw)МvaֽЇr(ScĜDzP  N2"22ً%RdtBRd矱ze+Էl+od,3/=*4mhz}\w''#7C 'i1Ah`Wj7!TN(8}6ǨF/к8{p$jdu6WΟ3CS=K:+|c>fEFwѬ_`% M+a*wm('u9Et-"Wu\p7;e{_HZe^)%S|>0/2Q A(Pj`p([LeÚ~ 1P7jҊ`N}֓.o QށAfC tWISܷ8%OTZ]+bwGg\dOhdl:qfQ@;~ Dޞ Em e =$i1ZÐ8!/roF0E?h fShط3B96Mȋ|b~#?y' -'T3-V:뮳VRaNmY[GWn֖N7Aђm[F׶pib7&jĻ FO/+N{bJ"0(mpy%Jds]@Ccih0l}mxUe`pIFHHҳٵiL2Ƥ^NaEKυBcwYceL \@Amv-[ڕk٪%1&gBbnrY>Zj;`=pm e =$UX''ʃ Sa(N+WMڼ? P;m I?WC\ER0q[_7!2а>&c|*Υ?社̊)ChXoEC[3'0NP7m&˗9xBt& E4- yT 3r`~x OQeaQpNe|S/ (-'T{?@;!N^ ͫCqm^nuI3 yj,xPƋd7XqߊEn"" cQ.w?$!1Z ֪FuEsSd /H%"ٓ208w/>y'/[:l4Anpr'iׂ$K>OϐAPt&efa@qEh%[_3Ms֜D u0Ԡ0e9K0J8ɢ5QX+xrShX Nt+,=߹dEݼ ME 2[4.YV?A ~־ҹ JV8w<+2YBܷ2L jz;ܣoyLm4Sջ (Ywo}h‰wC4" } l_qs3feu5+z ;y?208>Gi,/L]K֥p,{+(I IC>k *g=6^*c\;gl{#EXnE^DeuTE`PjdDaՊgjѽ 路KBuJ,m?އ8|2PGnRGeRέ";*?{ptj/g!}x{٫p^ϤưD\IJ2ގQVXP 5:vjdϖ^eQGAq ̸뙅Oh˶]+a|[lܘρ)B }֣w %85jau6p̳`sEb%*] }>/˦*E%ns>,zzb|f'b>QOtܳf/mNxx+2޳|OP֧zZToE'V($Yxp=Oi\'ϐx.t1Nq61Q?cGNEjwcN=uM7*zC:ɰnZ 2F5Rw5@0y9 ۶3'z@BͥCԥZb~LGf.+aN^[ ~\2[eq"0(=W<Σx/\ kBr֜y}p2Mt$Y,t?[]gGmn֥6, ¹&i-PY\vV2 DG *ߪSl@\W8[)O\׺q9 [9n‚h|̽)NHE`1Ш8G|ch No+*LN.}_(<@}/+IXDzFP 4̼92sy ݑ,no`=G'VVXP {uz\|Ds4fwݮFq>>%}ܟɣ.ǔfr eQ]  l^,űdtkZ: *)1Ŀǯ?g囜 ߎ:>?qhZs9@,s-K薭萦: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ōA6q7嵐a|e| a!C{] |UyёTPTI^z!ފon)us.3]زVarTT]ͩ20>,EV;1v]<%břs\J_uL S${4?)t@sdUa9X ̋서=QoE7;MJIqv)P'2}M^Bo SeEcy7aRx ۶?[%qQb_]MBεҳDyUbVVG;>2R5ׂ*WGC<"( JO=OC ܑD|>t#lְFB Մ:9Ⲟh>nDdwHNR;6 T\QIf3^e5\vژ}eӼ.Lg4v?'D[LyV=թ 4⯻گS?@yx1:EY5}]b+4RaG0g1e'!ZTN,=!*~߷]p aj(V-ni7~ׯNczl%zoSYD6rFJϼnmYCO GVuо烬H̥RVoCߵChC1 nHR:g޸çoS˻~ =8,@ITe0pE=Bx:F!Bf3^{ƕo@4x{V.&p#6h}PNoJNgimU ^  .fI=۳/!w#LiXda9BּD +vҁLNsp+S@[Tܽ=Xeda !V>>S;GPDI0vQY-| ,'T39o"LRs߬W3п7vҚ;2>eo,Qi3auЫ ?խE$C[cUCW8nGd㜬C>w lG]9r?qӤ3+pjj`p·v j!T0-k.⦹'oMcۍ:IIhKߍ6+?uG%wTXO\鏖7vC?i箷~WǮx(|"`wP|1(DH-h7W2~* cY B3$WF&h*r8ꐀ^:›WQeB xK ЌCu Mn}H꼈+0UJe:*u2M L/Z8N*{҄*ӶyKc Y{K>6nsy2j`ps7Sn&҂a8ZLiI @G)#!Erf~B Y;v5R{80(jU*ϫCk%a20D$'.G{a N$;=:C*{uF(; F=?e n57}Oe`pOhu-w>5FVntւFG{llg{W{;˳ WS*F[vh]5@0yߛW)RmΣ`gEESʙu FKQ<26 yluKM;g24(Dj()^IX1J%208=^m9b;x-iUډ :PndVՖXAu+dZ@+U(/"16]EI֞'{'`-,+KuwÑ(޺_H X a!C~%edL#اx PwGӁɌ -E-nGF‹ &ު`@X:8COӽԱ'w8Cok.O;}6v';c0sJ7L8&c}<?I1"2Ȏ{70:)V" *`>x0b S{!g-F*`@V;|[m]v?+ &^J:EȖNV1:vp݌7iI0t b^#w|p-z@Y3(v%L7F9pٙ=$V/U kxyǑ8sI`XVB-$w72 lS~֖ep?_{H ~(6x]?W "@oBObK|$v;y;q3onr q˩#FsH?%Xt*ylA:9dM/i$p暼ML{ q܎t1@(Xݓ0èz  &OqIdnKYKMfFZ 7Fl L~*W9 +a_X0RǶe{BXJd>Vu?w[]߼&% M-ˁ3bψ"T$ 8\*ӣ5כf#|wi§;"tӆ24(ȎI) -m!ˠxS0yLu_ ߱9ªK 67\M '4MW0+4 :TsD/SA*s0;b>[&=Rf-[SNB>I9vf1Xޢ!fÁ(k3)% k֢SuP@:/Z; KyfEl5r{4Z!1W{UHPuӬs' J|wvWbB Ѭ'#Q,`EDzBQWwbqb$)G&I!mq> ['֣W+0pkkP <1 [I wgueO6)GFPgӓ,qbi eu=*$(x֭L*"]u,OY 9&UE70za)|\ԫ43&#FUw@P0~ 5~ΞX ? 4oEN*ʫKDtФc[$XFzPcI,SF*q QfzN̘FaMUwU@1Zk!󽝈NV"v3MڀɏVe'j:/j(Xbs,V)5SYj$QO0P[nm+0|Wk -okx΂K5)Mp 3lg YmU(a஁iN3x~l`JL#zH1h\͑s2zjw-;rgJ]:+h%7To-A7KHpʜ';W>}\K(:%O,Cl-)[{UQnω8q$,'Tua~'mCZyw1 kodC:VYj z\qFHxAhQOqQۍreY8^nE#pNdRK $~+SWZ1 ✗ܮ롦eps<9lf{~,D#ܝʈ3Vzwepjk|tkpQ '- OSo>h'BE:9(93<)) y@U@ft&#hQUDm 'CІU@PasbUUuknF&0r]LwbJHp1qM$H@?=uDvUI=k]GҖT!(%8Dd]т n%^@4¥0mUxqj n쵖O^։y𥎸6Ж'T?B˟ZI} cJ.͑}=" 'l$Tzb; ?h{ _+Vl\! FqiA[v '쒥 $imz}yo\IleCÝN'aڰ .b;5Z7Ωu2PHCyWy!%Ow*q QkTpJ™l;jϣ .6>1~588aR  ;ޗ7E= '6epM1ĮOr|mv">5GJIC^JM7V\;wmSx:s4JNa"R D( q[쯷03*NVU䬽{X-6=p(ꪽ*Y~.3$kYZ h}@ |`#.wBN%MzBUHvqj qc(ϛ nX*ZuW$D'=E% Fy)^CR|5+y5VI]AXaY]O Jy5  (!~8v/UgPpE{ӑ'z㔶ЬF*`hR:K?9MXrxbêj 'WsAcQxtF[ڔHv8 ]{6RBɹtp pS0iV5tqk~+izi*,n\Ftݢ n%=zh!QmO KB­ͩ*g2r#?䞚Nͤ8qpWiĥ2XA/*LoY`\ A귖E ιt_rbə{, {$Bw:sٜܿ2PKWUq5D9>{ nXa*.YqI$gG(#+ԇWGGwL_IW(q~R}QֺGKN`9W#FC[T#Rp{xU8=iS ,-{oRk[Р1Bw\@}N✦B^!*x-V"[1P):<% ꩿ* (-]3Xi6,{M):pߞ<;c'O(hi;,\R`H#_Iֽ!0ޛxbxi-y@xyoGh2]Nd- /z \ZtGpDEOԃ}3:@1wW n%Zh ^w.WCg߈mmWSH'X5 aEg(z'@JPNɟ혲u6ɝD@:٬ *`"R@tO痼}$ڞ%V#LcR[$KLgA .s"ǽ|y\e>ӖS(\Ex_oE\Uja|FKFTfO:G*ox]ݫiQ6);%E(}p}a G9GB)8M^JO -e\<l{Pc^ n `b+`{#p(@Խ}mĭ;Eny'YinL 6pH|CnhtȯiJʷb]⮁aTUWZ-Nlch?|FS %%x! jneY]O i_۝#QǧI~VUganfOkM*s(٘ÕBۛLV3d[2q^OA +@C bZ.XC)6[ij^KXvwwߟ =$} J}2Pau\lUQlƚf̡xъS#b(X0HJЉ2ow\!k./Ph:c$Wפ?'uv]{l<Xi+lDgQfJ)NG$' fW39)ۈ\e amd*Y^~pFgDofQ 7꺮6گ1v ӄEP9ZhFx;{jx7]t=-xbKL+j >R9~Z6aQ]LD(5X{0nZ`I+ۃY~6 $ {y~&2b/ 5 LFe#P!.@sq7M;{yJpoJǽa>Q]t}P|}m:QbWkaQ]pKq{3tF<>h9H矟W{UHP8jٮ1 ].r%`pxyO iWo]a@]"½G.}H{m#%^n8~0/Hq>bXa嫽*$(ܺq~&ڪ 7>$m<} ?hu ^#b\ڮؓTx9)Jy"M-IvI9HG\eu=*z@MVB[Gj֞%"@SAs VP밝)6G٢`ɣvݡ7z#/ޮk8?k2GJΐ8ѵ#x-sÌ|$p&7MQ SkN *`èPTwHNǤaMGa䪻* (»wɽ9Pk씖B}pYhdsH_PP;Cmm`VOUAIQDd\N1(k(tv{Ip)rr?oiܽ8ʻ~J#FFBFlJ,ξ.L5ny\is aV n'qdW_bNeptP N+}܃g\{"roA Ř@Ӥ>lݽ!l ?g47ǤЬϫ\EݻkJ`Xtv?2q]h0V|tW;r&R#l@۸j qݯc 5$urAw&űRJwصq6ð: %&PZb?g.Me a(cq1ڒCCurɑS cЩO+a eu=*$(܋_@n6yfؾk]l&c<%o4ρ[`dSVnF6Ipùmԑ{h;|j3<1jƕ G[ ZK䬺~nepiD*dcb`1r0QEe犚 "RVn^#y~L-9RY c*'14w֎ #;ja_L>xoqE>tf9V~N| ګB +<\6d}bUq 8 h#_UADs#kYT2&^JhDɛ+g¨oU>۲X:g e w?#+b7.>?xZ.H~qCݴL$A}O`9>= 艹>}&DDsV)#'+7iUu^nXQ$2@c!yMCrU^$1`2k%P4 ~|G:+A䵔8{ l$6ƈ^cLB9~S+ ֩]qC1ptmK*W{UHX]CPWPRF0ZLnq~󳻆evL$$=k%)Hso֊"`4 V[sep)%dն'1 a͋7Zom 6KtcQ>H ۣD3+>y>.a+{RZai'T4XϹ9S j$>u&=3-74G"aĆel0+<4 $͏O″ʮ~[ɟc qiX]W Fgb2nmU]ڑUJ#_UAtܣ72ےs;j7ɍ\iم¥ڰO*c1#_Be^7sN(/U!HAn0tjaHeY=ڐZar^p #|dEA$CK7'/ҸSwƳ'#0`K/'>-8ߛXY+ȱ#!5ʒB^8Ɵ"'X`kaD6#IS="._d¸ep lu@C+ 崋[Wnj-YH>%o.<0+>pr@peNd]LI]uT^% $hЈ[W7:S8T6:|1\ wwe 1 nu4z](z)jBtnVO`^ϵ$ -N=ŪS(VZ}fńˁSFGݿߦ⩑2ԙ-Fg(꨺*X8,\ƒk,F`l͛6ڕ#1'>CI Ɵ]6g**5]/jH*6Bqne({I1Ze F t4[}d%@:T^I "uǦ9`yP#E2sw~_ޡ0ux.CQYU@zvCDG 伩| Sh C"ɓ3\罓ִ0Y GV9QoJEV(~Ar6bB,Gq\D~Y!>rrۊX oepd*wH:zޝB۠mܬD(s.dGI㨿G+5mC#!W^c95:O1têj ^ 4j9~f6{lP<8#dHi?q_ђêj # J-7{EH0-7V 2JͨG,EPAsܯ,ta|$b'e'?FKE +l,D5*LOYw3৬2dUU!]S 3iik[$fu^c8j'pI+J`epԵE{i=S /~K*z*yHpCJQ C[QS,j7ECE:\Jjўjf?La{pepݑ׽&E&J>Ґ Q'R CTV_Τ>]>)B Q4ˆ73'_$޷l\dV-/pj69$RL9(fW3 -o,2̠fH\4aNUPE5#]Q.$%OZHWCy/$!64-ϕ(=#'f78&ZBWhں2L.SaU}8(9sDѰls㕣WX~Vn3 wc֓K]#!囋@P}4=Z썥)eܞp<(5f7-?t ݥy4:kǧ$hlB1lߴ#㙻( jCN1 @佮kP@'g(1{g_ j,W1EwC0 `Epuz W'F|>`ta7*ګB9f2&Fv5,RiT]uW [iO19Gu(K@Z צOL9LkǾ\5##LE̔)fɦ $hT}'w/VxWF-? *-1@_w'xzBG/ h꩹J(x\zާ}-켚n2 #^9X)`h;5WVU{UH*ㅎ |ATn'nƈx/Yxvω#G ٽ]I+0pғ$$!"Pvq.Bn9-rT :45=vdȜ%pU#x[ny?g<78)Oh)BZIV֎-`ɫH?9LM'(Z]#2G>>i*ZJ !p|qP(8{0K/Q 7SYЭm'`1I%L&=shR!>eS{u.:xDUv+n4NcgcDo*kV/%U>+rLO@rѴɸ\) Q6"xP6($81=]%@ߞz[溸e(݌InH +6aFK^X"ׄ )Oάe>ePY bfQE3&`!jɮeu @J+S**C> C0 `[C[xl;T0e arrq] 4Kn^4H=e< K0, U!A֡hTܴߵ $Lzg= TɕGeQD8zVQ}U8(=n /"4l2vi@nv)t@. =Mn54;S u,JRh#GC%\1D5Ѫ7CUX8WKCC8O8:Sy+Տc;V#FUw@PL7J{YxES2P}$g$漨Xqm+- ~o$7#md4ۧėx$5(o b\y BmY½,=Hρehᖾ$O89jjɼlǺ?{R=O0ǚ紸 5P+ ֈ]qԌ g7xU] v4M.鶷8x=8_ndQ V6EC%"ӷOTeO(T{yW͋9桛I89 j&Q5[n &W } ˽44߿{bDBQ4z\#w5B&-ʴYi*1U̦2ZIC abZ|L7)H5JD$z:& C0 `bccw"Ze -ⓨHTOYd;jw经$zXp;$n, -*w$]e(3ZO{iz@B>ϣE6Lj-{9m$sOi̭y =OWY}go);pe $sFoZζy?g6v3_h4Y EE:`pJZ@=]kV<{>>\fF zy]?cWXaU]W>v`29*8Dly~oGaOYaU]W[:w%al,{A=#nO`%'Tt|W8DQ> EMK:ګS=FTF'.vR2PaulE7463Q©.X*n$0"hkJTjqxp>w zBUHP1c`b6PԦdn)#=u;5q&fL-o%ؚ2\[E(wcj:JSM_vo=KGJzˋ6" TN>"E?e8 v\KO˻(c+Ncx&M.V !QB_e\ ̯7kk~}ZME'UU=HRpB1pNɶ<{#*>G+ o(&o鯋"R0ݟ,inPW43;̋X{,d^0x,.A|~T™da$-6vAB=-[͠!m}uvo 3~zK~< BazN]@Mg;,5甡-_5^0X=mu¬}BQk#{']#֗5ʘIԯa*L(WNMiD}?$4&P$1`8-o[ʔ7"ğk8 ꪽ*$(ŠDkVkw33"N 4s" *`I,,Rm<8dk6YӚK|3b)0QDv?e1/C$n#!H[B[ bkj g5RkڞLec'f` mVg zBMeΆ`VOUAF4 vR'n˹}GIZĜXr_ /sCFm7>0mX]W CyIPl8DJ=fS !]%|K9B3X_mCnXHCX6$'ƘD@QYQ?ezQw,(|kgagf31W(JuQu_sI64mT]uW ۿx\2jG¢|!s.HL6jSf+0pmRjѪ/R/Wwf'zt{C'K?^"ciH n+.NgVPa eu=*$(\b-%!`]ơqr[Za嫽*$(}*(rOeʨP芮/Aĥ|1tB\ 0DMa"SwC]u-E|.3]}202׺ۙ^+ȳhG\=u%,=*$(ܺl{{=lC R{ dUepKVKS%9Aux)z8 \ {:5ӤpGw̋"N ʶhelXpoVǹ"GQIZkv< ։_l@X f÷lmmƄU[1lâ4vʪj :AEa;M<^ ̱}m2P8LꞼ&X2001eZ{jjmyM(@;]x*i! +ST^/Aebnt粷-")#=uWm%:"IUJO^`ȥ켻|ubY_^ ɜvp[=O[u1gb bYDlw,#Aky-H'\YV{sZKǠ1笱.'dkb`XVB­C 5<(E&phd>\a}d<,Ēi2PBA'i {}f,e?3$|g(B3压Y853S-$ukǙȜ&K0,UA–D]صƮ[(@~ 3,4 O2K0, U!AdJ(hpvP.5F; 2Pw=V4`K޼G3T8ʊ5nr`^0 /xȓ*{r{2P Tܝ3gK2lu /R 7˪W0>Gܼ̾s Njsc167Ow%H{b2hKF BqbTfɽ~e'{ \,#N (Ǽ?b7l} [6-}Ԫgk4S}%LJP&C94\#m[֏t7tt$Ϫ O[.i5yֽ[xt'}ir?yy&K0=ONCPBxډ $3?]Z N=Of'8{HDRܾ2{1$TyK>/2rZĔ#~-G>ڈ(cLAiL>e acx6ؔȰrL3)rJ\..Q%-jȏ7\ч[$.p-a%͂Ri,rp7 h꩹J(xz~$Щh3O:=4dL|],ګB­^kirWZ1ȭ?-^`:`jsP N)AÚE(S~}Y3́n90FI''s;`>Ne/I.'ɈcF(5<)UaHdX߶AeJVўjC@[?x(ߎM7W>3kojVKo'#~ķ4sQ!v'nš!DPQ zڴT 7&Joci1 ͘tkgBMٲ&#s a *`FsS?e/D֒elx{05o#@ = :(2}z9e^5f&$ϴI^[.nu˭ 'yҍnWH=d#B±_:;Ol3zt/,{9"noqe} E1_`<^w V!2@̃+M/"6"P(1S:ӹ2GŸ8=MOLO#r$g4e>D(\bRX@X@[عsSUt:g,epyI\}(vRklSL R`q\˹~֥I;w|nùC-ZV[u+S(ܘKJDd 23kntb Sro/R/t&!SU@P0N}}PAf7kWyt{"X+4DHYH{pD<8iUu^n^:tO,ZJm*YӦ2P8nTtCyI$YjU@P0\I[ǾBò z\VzH Q 7=c#l<'pko1 íCK!q{|<{>QK0,UA157hcy *}Y 8rdcH=.D Juo q_9ꆸ3OӣQ 9Z鑴êj ͒cS 0A E9X繂t kևEJY| 訢;BL Y>csȔ F` qĊN=D@EIo0؊&J^rhnU@9(Ãlh EDi\91XaY= Vjaa#qh*3jҟiM=WHUMsdV~&XE~ ^Gk2}HzOt-Z%=G?QV+0p=5v(H>m(TdͳSV/l|M?+0%e;d#̃?'?j1" ;IֱYdL,2E0i6vslsjB@=ahζ?HI9Q]kSP-0^lLW LrDHPG0DݨrY 2!X9O~jԄјS1,*ޱh5DZL$6|nXLgtkz-GRUϗH%0y~o9;X4n0A2n>nڰ9"k(Tۡg:^r;Ci+δּe/)0òzP$luМd4CAdQwo{;IF=Qh[}#N®[EgiM&FbX~evƗ|'>_%/J- ~܇L1%@4I֬`VGU@ׂ} qT*{1}"PYB W?K%zS%C)i<# XcyRHʝvlKיwK1-t<ޖPur[&UG= =ci N LXaY]O p & [xY@Z20;z8(-=Y`,5^H}eiKg_]J{{K}Txvʘy\ nRF7'@|;/~bOki NX YĂiu#312P8@{KM}6X3|"PϦR?QA*{yJ!#Q/hB9M8EHs+q.C>X~ۮ0Uqۃ`ю#6tE7]-aw>%Mp]C_)cD|[3Xᕕ^"L% \mߎS$.B7ʜR]C!PF$C0 `rB$4ێ}mr4k(\:?Nџ©>%$sS,80IZ>F_$&h9fI@x>V`XUOUAš;B| V:Ci\kāXY'xs?z\fS':bjfBtm:W慶a pJLQ N=6)q4^+""Am=iz8j ʒ 9a yyxv4, ytH~v  B~p\IWptaKSòPni|H[Q2d_QY GVx A?4k$pVܒw<93%R'DNU{ܑ^qdѷ @:5ŧt}/xi?J a+Za[ҜE`ÒQǡ;4T_#tqh8?0S:l9$2t_LO5E{kzf'>&pQ xs'!p $At": ,m?k8xyr'S(^F[&Fw?2m9pwL䘴Mۖ2P Rm?uo:fe^ Ӷ?pץl3V/ͷ^.0Z& C$j7'mlnϊY\j񟥌j3@p {֝MLg7x^ #F51bv<:w7 ΔAAJq\@U3:D31x) j\MǷ|0d(ۡg:jv(/D$v3B_3SUO LAwYW'GGoL#+M074ilW쒄 e#dm|[/*kkI%MS(m)pg#7pv?(\:8ZS}-!,"'z4W~{Sd=CCfSlv]~=FR~qCKX:Pv]h[f;ڽ3i42g,}ih]ìVĸO8:/_HDǏq_>ߌxq7ʈbČaX=W3z֩{2wONS(ν3?4۟tӬ'!>_ŦM{/ &GT6%TVIjAmuoo%(4MxI&pk˜L.Éݸ5?,s*Zal'xux;v ˗H8[3 YW{K青0H_r !&Qw5$Lw1n .>q]‰\q4I soQLx3U K0, U!Aw.F$@Z!۵:J]tswrZJ@'}>ѢKK0, U!A᜝uwX9ىCVɋ$M[{yGBZT9I2P8G/!EOz^ ` ^OF|e>=KXlF`~V$ O!B+UKZQC#UGNN 9w]D9LmfR Rȗ>B<~_UWg F"n99cgE]SR)?bDѫ+PZ?e`wNUG%7겚=zr4 FCӃ|86SP`XVBC*IV)7¿VTHY}^M,-x_<"-'46㧬ګB-##D1;Dv6! nOsqQp1ƨl!qSòPnmt7s|Wn^$hIOm+prW+˴B#8"URňy_,/MX XtX^zp*>.;pL+#ᤑz2Pg65͢cZF(ԨE.fHT6/)ȯSx_wPve<ڷ [ *NI#;WQ)eh3H́ܕ/4gb=un=yf?"=L{]focC̗0']ㅲytOWM,UXaU=W '{~z.(Ėد7qosEt6Q oX﬛r-K0%tKEP4kސJR8rQhMcˠ ߦ2: 09B1s ӴRòzP$L/ z$9720ޏKlN Wg("mN̾GF3bBhꩽJ(Ѣx|]+ c\ .V`XUWU!AVN9c J(z88:Uѧ)"{1C)؎]4RµD͘Nbĸ_|qxŭ$Gʹ4> +ܪߕqZ zBUHPeQ(Z9Y '=GD((Qi)GFxeu=*{cEt-Vdå5EHB wZaU]kN@ YCLİ5N{lQ?on[kxN[44āD-S'|MBIE4iS(c(uJع'> I 9òzPl}XҶ&)  “ˉdGtV`XUWU!AFb0"YVVӠ5/ LeLOvl$T3~4ﺽN:]3;Q3P~Uic:11[a͈t(v6=>- zV{ҬGUBi¤{[m&I O5JЎtş[.0v|ͫo4ߗL(nsD`epcMZ[faB]uMY;E=[WJnR Xx +6RK(ta01쳿(I骑HI`XV񋔔r|$8:٢- ʼn [V`X;6]gGz.ⰖH!=k ~WnӮ0~ pЍ0pnvesgly;0t8q[_@&ֽ6Ss80>z[&2GW]RKW ꪽ*$(M¸ _y =O ۑ?u{vw{MJ޾fCFVK0, U!A֩"}4$ ,<qzXȝ8=GDA(cgD9,Qbtt<$y+$p tJyq*R8o(`êj r$ʅyWYzB(#[FV=JqݸxP;[~SS nX})b?»@|S4Wno@x)O>NQ 'F[JgHB5 0FNj =jFUZaY= Z9y<6 !`3 0g.{פ*#AHҴO&9hZKlRW~BC G&GŤ @wʓ37c S)3 G0s(`XVB FrRJ.&&+7W:ꑕ%tm_<<7=`1jTc׻սdvZGmЕײ5IJo+?}*SWH(\D#EcU}S(}=bݡ8G_\*lYI@Ypf3C ~ܓL㜆. {x`#NyFS E[BªL-_{!&lEXcp'2{cQ7} #\7Q 6X-{Sz '1 α;/ΥgƂ2yY YeŜ#C6C:-:4KC4N8=AH')4M#5ڹ?Ÿt981dE#"w-1s1Y X!eT 70*KE)pkPuʿܿq} NSµm=*s̊sT~n;wXѼ@{݅LAʪj '#E,kbP?g}¥4J݁={`mS=5W"#RK?oPOA~j ND=)Hn.JZbR\{XK,k̀6OmSqDHh+*#Y&rM'wa =Ied*ΩPWR! U8LT8kCu4Z&ګB5+RNY,3]XIUyU@g&،awsk#68$922qSg #0`dE @V4cb1&_}Q2Rip{ܕV`Xj GV;*Q{I#^b5>^d!M :Xc[>W<VګB‘)56Vtb(Fo`FgrѬF`  &Vzg>yg7'}ъYb8jLe|qҶJľ\ZZa+a:HYs+Z"ֻy y4]ޱcnn.qVSyU@OK n͚.(uq[$Rk#gnN)#s쨺vy_ŭB,"cX'|9[@:"Js0z9hVma|U'm8~+E!Kq fv$uCJ4Cՙ,VkҾI'XoH2PVԘ@p20-Q.?h 23EYjκek0JxZ AwŠ4VלJn]ɘd5=5 &MႜߑuΏ&u(-__yn\*:R1E{֔3fzp,V[. [7kcWVz+Ջ,*ql+5zHep2NziEK5Za-Zycx%E/mDUQ80?pTړ ddGIUK}⏴l POO+PY_zqݼEHh` w,3vW{n#@~/~97KHHb쓐Q7‰IBosH(e(ɜ:Z_aO^SY+/O:dkyTv(@ZܲglJw璠{@C @F` vHh4ߊEc΃b3??) [n[&M ;;bE("m3パ,iMg~9h ꗀ~΍.rmT$h,WCǑyg麬GVZlKLapY{ݥ L3$Om8j'@w>so& (\Dp-,W\:6UZJ_g^ͫ1BГy^WS7r;O )6+S, SP<4"P(N8mzMӳQfg>}Swײ7W9^,A Z0`I~*{tEI  $Lu}ޒs Ŭ I@WHIWK0, U!AacbsUgxP?D(kV+FVEm$NO}K(lFqG8n} |z>p}<aT_54jn:b!]8OXk#ޞP9PqhU㴵~;ajEO}i| sq}t?BMvSzA-T ӭێO:.=1uW>ܗ0B"B'jUYEug6&H 2L%Jr/i˳Z+1{cNly(oMdIx:!ES;եC&si9zz0oٿ&qgXW \zwY )%xkSW  Rc*ǒW LW=0Hވΰi]8O[S{t7Vs(I4blԕh%RGkq&$R%85j`psO67So#94vyM>wi)^9"}jzB5H08* ~wCrZhyL208>%2#RT1 {={SGVNonsaq6]gߩGJZi*{9'J"0]m%aVG qQ]AGyY9zB5H08=e\z*EĠAƻDw.7+wSPgWCJ Z G1i: c*ђ::ԏ1@C7ph[]ヾ*7|ԴQ[]nѸ6VXߞ>B5>ŎsA(208z4d;2.s>Oiw*e &z+(KD% BgqKT.NeD-n%Ɗ.{k:3Vs˦6=ԂH9@-xtw̦[~*{>@ֵ9記䉹=x.;^EYxD208ozD5gܘ6~ÛX* {9;Aq.Z4A}j%Q읍boGXՉd* fޙ(Y_J~#WH] \e1ϐ ExutC'vĵ01!( YM:)e e =$]hID q]ܮmTeay=8!(geS[-ё 6p! g25j`p=|a/4?(C5W}VXP g(><ǟ_ opO_MaV嘿` e =$<6͡;#@];yKxzOZ[bLkp %p`N-$10 e`p594u4%]L~,~m'_O0NYȭK+. -2kXCW =Boޅ=ΊuJ\yEʈ`I`-DoEރ,=Y6|O"?ùp+q]Rᯈ|O CW*,#oS4<o0"0ntع+:5"sU'O33.eXҷJsHIKzWit'C3c$~7HoaC\8Ҩkoҵea/$J-җ}ɭx ٙ='n&ْa(~P\ph[(' <ٍĻ;[qv,Krvk>;/hy'O;{<.PQ?wMek4HIP*Α9(OInL7`jPCjsjF |Oe`p9Xc$7Ur\eS齇|S&JyȲDOL BګAumeܪHT''8FFq[WW 50>+`b<^{q:9e_;[.ʧa-gˮyNJHO轓k,k z]e5IAa&ejwɲn^sG"9|Az202:8͟R!208p"=|iM$Fc~`]﹔N}{$6r")KFO/]wT۶$eqH/7~yxC l3ͧMcѷ-Nye NOg5neZUcU#W S?7V~(@ `$CivYX8GCCx.20d/HrLO(}QY*O= 6\{ePp1C>ʅݷwyRːj綑dd!fA4IYcY#GvV:B08b%rvD/i4zeU ^  Y&*ҋtb.̯ݰL+Q\BF+t= xbjhHeW8V5T{5H0ihƔLD+'&-W^ b{|{^_^O.! ;{ 4LOy)f=G3h2%GH>F!y(sZވ?1?Dea%+hd W`1z'_XE3A5-t#G$r6ͷ *>swlKtL'WgKb0F0_дi6UM(*3K"vZ71xb2wI B'ƥx+`H_(Y)a2OreZlK' wdneL8Wp.77(I`jB(Z_0qoOTa0ziUD0@POJiH^1WS.oO-#biฮP;R+^hszmݛ'7ݖzyBw{g0‘6"ѧte>dCygCp kj``I dž3b1$be<)r|M&.Uݗ.tjFrN/ڝq#/s6l /&*ja*뉶 }{ }֣}~~^@䌗b^.fmU ^  _Ώl+\rٿGH ˸e`pjx 4`(ăqvkŴjX#OX5653wqOvʎSjÞ/P.4Ip4PlDEx7Y:o}n<g%yv6OIzVe"0v`>&#'46.~уEv1"d.uEb&]J]VYѭ҇ګAض5%czQD'_t/,xp%I  h4E|q:HtѤ9UY- ̑]+<)y;^T\>t31^hBɊEvJݹ WQ~{~)>A=o(H7A#Re`p$tmumCΡ !jF{tK-4Vn1X~S?›W5$oߩwQU,4Jg]6kL~ b(x:ھ3w>Q1.sTAΧ Nut"sYBm;fC|WH1fk&gϪh> ]pry&̰s}@w*\K{pBI6 ? ׿DݘC{)/e5&,lCdP|\Dh+pUWT5Kс8@Cgr ME!u<9 $s[|]o)Id )gYsk8V5T{5H08=+]8m8c.暥\sO2kT#UW6 W"^mBx8iݨ”?mQj``z+< wMxҺMB]wm!ti! j9~GwAwgK9=nFZ6ǨF]xmYC. .p= vw1++pjjaބQs/P `<~WBqS\5 /*7{.wO'և+Ӑ7׿pkaRG?Έf5AoĂ, kNean5!vC)]20VԿTPU/i9+Bu'BvXɔf(< [{(3Մ%!jlu)@Zi &ǻ %8=N<ɿ_" Ch( {Odtax |>@.=V:R[27mqP#mUT^ 4M>ķG3 x̍WĽvA ұ9*Ǫj Mh UvD0AXb6+pjja|jCQ8(ZI.%G5Sq.llB*VS (NZ\LMՑeCެ{:&Cv"Mx:0=.7(Kp,k u[0@·Dz,a&*X Z!x]ߑ psKB{i~UeU ^  nt.)~`c &Y|K$yfW| 6c,k 3YFENxX͐#(յXXU\ 8Yۊʜ"0(nP~սkH)dV\Ƥ !8+90BTr;tsNb'܍ν'QN φ|/ǶS(`]^r&ӱsests\*79Z(Gsïs.1B%V^$(∮8,C rK8 ~k(^Cʑh/@xi{9P,|9psШAd([WF208BMoQ;dUo󷁂b>} 1T_ 4jx^(۪ee`piDO!^%--e֦*D ĩ&I_{[uh=,""yE+ad=EA|Iؚ٩Q[!l m e =$Z15qg椗=u ]g_V9kv 1eo?a5PKkfs11I4mU ^  j []k'85{^DK.wovo#z .<#g+?8PBe },]4(a8cH 8FnZ[ZN]0]}_qSj[0*V{5H08n\ ]d {'Ejwonvc*!Gb`ƬH܅|lk"q-Yi L#Ăn=XNl MuK]ĒylrBhړzڒ%[WpzܷRV=ޣU5IYGjR#OR5nžbs#P#|<ޥ1d203>wEsKB.Qu}[caSea-wjvW^ۿE5N}bPMךҹ֌XN@sw~'f |]׻d=My=K:7^SXVdeP稳U208ڮPAo{?a}T$>NK1Vfg8?e`p슲{;9_u{H ;a<<5KJŊIcZh\D+=@0/f(\o?|C# eaY޶66&SqbxH}cYCOG]&c˒/ea+FU,<(ݏ D#=!jۚ^Rl"&{%V|> Y:9,̻K]Xq$~T\F2f#D!iPP3'_lkO6(}*2T8=q Y=Xy 4TqiwKӖ eP<0w6ָLim\i]hIPAjƈQH[Jju&x<]1[6kFu}`Jm;.VGėiSU4X#Mc~>?۽϶?]`( %Ҧ:]*DxKpZa!`"Ͷ+; ׊oX \=2O>O`1_ }j9UX(CBPW2u7A'U׿ eY''HGI׿F<>|s޹M9 uoztSO?M'q 6VD)k(C :҄AB;m2h*' X7ʩ{Wo)=4Y4?^6)rRymOQN 1;Gߧ2089o;0w1ãc8%h`3sLΈw߾ᨤYB>+QXYcY]+ޱ_Y'>K͕I8HQ\|U`j=}]0u8Q)#]2а>K""WߋxV^* *@?E5-X7C2n=rrrE?3[g6fBzLl:{U;]iD)(Od?gb%Gevى7w*뇜(8wd8_<P\D:LLAΧ֬ N7NE;s[E<>IX)QVq2uzB5H08gi,_h\Fű]Ï$i*WQ{$h+pjj`p;pS_Ω=޶l,Va3V@cFFFaAiq1rV/莾J-H?ʟZE9sN8o'"^j;w@X7yCk iӗh*߄)T#:Ȕ{qHk뉓 9X/LxBXt؋F, Kt$`hf:yLbU@^D|v-a+UYIT^)B]%^Ij6& n=f2ǰF֭Y+J[zO>P{Nҗ{*{F-I83&iK;8V5T{5H0n5 Ęzk)Jzt7VګA‹_ d{`4]$Xퟱ;PyqǛ &J_hU O)(Lf m̬D?ǡ(PCǃzB5H0y&l9L#zb ڭyu>,j2c^{&GuH,GP_psOKc?ՁTdU$Uv縅=*F 2%ҁ'TOZsJhYKI48>w@Ì Aҳ.NwP!V(.uSV|*G Vgm8uFЏ P ERaȤ@zRʞrH '~SUQ1:,jy][:u˕w" 4Z[*2GK99Κ'3:6RwԾ}kY&9Ȏxr~#nLg^gNSP zs[~2,k8.W 5$v)d0&9qv9ZI1:@.i Sf S'h! 9 i%-_ 0v\h;Ee֨MwTU(*ͽTV/wݻOKqhtoTn\:2s6.W(rګA.KO̻zu!B~3DFWP`mW.Bƍ$G!'x?8Ac,ΆʫAwV͙u扽} \2!7|s"ye e =$ ,fY ;úc]iϑhǎ^2m{HUrƭ've6o8E.&QsM]?믮ʔW>$A^y(I۲?<7Z=/>"4֖kaՖXA9zi.rkwU׻"(4]^"v ֮`tI])"8XcYCO 8`䍧O^<j+pjj`pw9P[Mn%ǧ J}㼌 炾t=FskjxdwEE{ig-~rۉ|0VXP V䞐H@ɯ%YIii?ϯ%7G}G+{lʑCܫSgNs͆(R>g cg;^jϗYɞPN\(  (|g0X^A =|R^ŕ{Z/w/${g z6Lu\Bܢ# 55U b9k鄣˺VOGY ;m]  >d$(jSe`p:K<+\P!V]H5te`pݍ>#eDjݟN0黤UL!&PBFawɅ\0j3gKp,k Ċ+YXt5 *V{5H0|G9v0ꈺ/k+*ӟrEay@Yc$(-~3p{~*OUQ$Bqw2XD#P 1OxqvL8XSy ʢsc"vȇPtZܭ 2V5T{5H0nl }՜}{.aI]PgNg~>Y4]:=t2&(#޼3L nzqj;/iϑ$w#z>20yvZfDӳkjR.}xO1(~&yRA,0 |b<<ri=nqnz )=N>N5)'j\P!eU ^  LR4ݽ+UdOϽ+NϘQ_n\"@ژa^\ƴ(u6(u!85R5@00,v#x m S}{TG|aF #oA4#Oq̞+Gtҥk#]jt͍+>}d](䃸P3HRHCM'~ۘO= 4]G4v]:QFA*jc>h003䚦_K t=mAB.Ჱf⫣ư2[vyYJd^7*\$^ݯΙ~zXOL7۱^bY2аB_r:PCi%fՉt=hmؕ ^dB1+<*a#>쒔%1燤20笖ΚJ^:{NʘsY7VgL(xtH&~,rvaUخHBz$*0xekxWϩOb{Ofƨ%Y;7X㓳^x('.CcfDTOFIJWQq@VD{spbn*/Q ]5 1²0W5|NaXfb4c |">O5pj҈ٮr*  =dېRXuSlfHdS eaSRtd/}˖&)gu]R6{-m#v?fc-(G ̯0L鹏HG҆d֦*E.BDrt|EU-]^  N57w3⋢n/f@n-ߜǬ/=gw=sʤGwE{DG"Р/ZsQJ>DRtJ̡/.-E"_쁽unZ7o.&2+ q%f'1e`pU y :T'ޡN={yϟcR {)4cWqMs3$p&c: yG e5DƨFZqb"J8ImCQT?}>M8V5T{5H0ihI{2xLu\ l`$E bN%?(7?"zȺ[aq]̳t!ZUһrɱsDelRBt`ƲP  ˶]Wy6dċ[̗L{/}z@eKd.'ǚKfC˯َ~D20Y q!%RZŮ~eNȋMe`p}iFoα ЎXκ Le,8FcecDUKN+s(s!3+i1oEzD-%1ϖs2+rS%J^'7!h ƙd qI۷"ibo wQYvH96,营:1ԻKQ24kueew{ 6o/'wtۿ208iKWqBş2)f%15)Ԋ&w;qIl[H[Ȟ8HTx'"JcX?+3f6,e歹tY--cӂ{^N鳁C ǜ4脈G JF#g.C4VľAvMGTzې{|[&T_*jw,_O(xuFZQ(ed NtX_GMc){Vd\k(fM"g:jr,T Wi[_l a>ȄD\am{Ǯ{y`Gj0JchD2Z6JGDhֵ<`C.4:FxsklMԦa"yt:O!Gk!f(#H*ܜI=Z.V9) , Y>K,=2Ȅ|f(e`p= qUO&Z\zE+8X'#7)O3V R{ &FG)Y(?Ws}L}"}‹k KhfBZ8t`8 VFaVXP z]"t*5 /Q蒑fZ(&cCHQ}RQwZr X *V:m{dəMJ(H hb 8&zyG;h^8x=8.,'dt7ٯ[}x{}['PGtb]:ß.GoO..|2\U*Kp,cO gNJڊk@x(ݛMx  C":FDũsPg:)IL7)Q9Pg3NZo1 mzܜ x(lmoί4x=Dy''*g0ΰIbXm쫸bQ' 7,4'%5:ۇC7C\qmк_*v\[K'm1Ӌ2085\䂣oM&@ʹq n,CVaVXAM;[&^c!JD"KM o70);0vګAuNg.fUdxZ˦ R|(ZVٯ[Q|s+O^tIYju۞"0(=XUEyZsHF zB5H08$a>hLgT8: ׭*+[5SU|thˇAq1[.ŒSoΘ}j%$L]HEpm?+irҮQ. Op n5~:.,-.I_>+)N{Jr|-%Z)]xDzP  nnC(o 0P[y.kVB@ci#( 0}=>rOG.cp_*I Kp,k ~&x`J"T2?^U؏wɵ::UGb*{2Ss&ӌ1r] r _G]Fkk9<()Gݔ8Vл$Vcۆ2088e-^DHrY'F1|_=Zd,. g>tWW% uG;cL` k``LSggS:~S[++pjj`pwɴ(+}1#7*:Yy:VXHAúѤ56J) XHU|1~v *Jx!gGAՙ6빳s|"ƕՙS\'Z]O0(zbY ]zS/-%V<wH i3! 8QfXZl\Ս& 6O6-&s?j5髍24M&Cq2(mOOG8cC[e`pzT-E/wrsJ\zl] ^  J7E95sQ(9ǖ}#3eu|Egn3M!yrntAZA 9C\_6B?EO!6V`P`9C.tdvH6kI64}*߽ļЎG{4fj""HfWWy vw{%Oڞ>* 8Vj`0̱s6R&s2,'ٚ".x볶 $ZaZnKĺ=?ZhԑZPe`p R'4*Ai, JP⅁D#JNڲsm=@ô'ʡ0oc`)+qd^k  |Ҿn=s K!&@発C$PNƞo)-MqO[Dq1M[cYCO ǿ%t;9&ӃpyY *~BS8y(e 4L !5+]b#*;c1j8FBʵmdwna _5 l^(l̸ChqGӑ?qXS |%rioK^om}wkx{kpSS[xQ>`D'z>)sƧ̘i77!#$7A /.awz )s&0_DwY28V5T{5H0Tk򁟱) " )&-gy; ~In 3- r>T, Xj ,Rơ(R?kfAFHU8{2ߗ;nݝwV-JVdsя۽kCmrdlG8;DK8|/?Hz>3w|wwe Jߧ{'&4/Ξ^>/wgpĝeE0%qBVjX ]Մtb16`!lmU!mod]kB+,/gܻO+լ"^vU_ _ߑWo z#{>s||-=XCtkD cvTemȂTQrNɱ!UUaЭvt,:-UPJE'~]Gvo2+:܋8{ڵqOk .w^f70V UN e8Ux3sY| '.(Ǜ[2AK7Lj-M%y03Ժby6" Sh?h6k 3S'V&Qi7MjS䉶2j`pzb:~&51us$Xwچ+<^0ڣ!nMKKA]׭Ĉ2hgy20 {.a>ynnL؉m#76 :MVܷG<0Y8C[6vaѬ$^ѻz cR 3x1\I.~ck 1f$a1]3S=3cV,Ïc#F0KSJji\kb45 I o\3D59$Q,= qN'>%E"%ex=H^s@ *Df~2NJ`6ze0Ah[ X HDxgߢ?AQYcYCO 77 nҋc0w ?zfWTojޥsDr5}2tL]iPm~ tx޻ks; ֲz9Zx{9I34m e =$ܼ_rl,T,icy/hͼ틻>@)1#'ab;[LUs{~0aU6`mnkLZϵ.9{ACcC3pM^65{OunUAB„(pf y#=r208y/.ewh7gq8\^"q)p| 7ZU;5Ʒs_N%mI垄yG=]&~gvqrTix-y.2~yQ ]5\߿q<%OWyPS? Obg0߄Ns8=mJ&k_G-n=l1c\̊Sz2j`pG0^(nƷPtQW 208i JnPF3V~]ݺ. }9P`*v-:R3'lUVn=6.jčBt9X&FcX#WI?14WNF 2;.:Qk*e֨/woad 67طk ި?'4dWX%3-o;DY |@Q*Q] :d`^qe,SވMlY^^OiIֿI7WQOPuY!D\EA8؆٨Pc!Mz54ęT.  P N,xIѵ)zKt; Q{*U!ыOd.ȼخTܳ8#=v C\kO\eۛ:ibRea<9G1q87*Φ+'el0'Gjck=ea.nlP6!shN[!mIYY؍ sjM#ҟMC=5MC5bUg~7=鄑KNKKw s~tZYcYCO DC~ew)`I?c3+EjA.'ꌙޟ<ISh\ $ ݢ~`aM;ڣ) 7?_-c%d?/9VEsc%6[H7 kw;*6<#_҆֝IpZh`RU8-[!tc'zew\* gLLHHGKM.ESW/AfWtx0 S>f@ :1)3g{(7:cŧ2͒%z' 4q_W !kk,-=Ӻ  b^ﲕ&C}+y;1wB;B oʽ7~ $ IE1%KsdAN8S?w D7gϾ20^j|KRzd ]C ƑqOw3ot21HSPJT_:5wS+!HO@qsDȴ)SbbNt⠬1K OGsR2tZ7j6S/HY?+"GxHC`n46FU%SfNsȬrFI^hud*{;Ml$E`PYn27%,MafT>r<A/nڪii A1B.{@ˉt vTŀKʦDZ?x.o)_$P9b|;y\ѳДFsN9ve`pYlj@2+. 6,p JyK-dZp7; }˕NSlЁv4Ǭ~] h^.Wyek0G ea}Oߥ7v kPdeAex~g<cm1>'H´-|:pҗR# CW92)cHˑ] :nc>`$pG[1X=!gSW;DU(\W"u NN:^Ʉ4}F}G}#bØ$qv'-i}HіXAs d]B,ҥg"zBn{ NONujۘX$Ys+bNezB5HpL9 =s673P{/sw3Ჲ]^ȓ)e2kLBhn%OZ,]^5 jI9mE|_,>M)+#Ӎ;!ꇂi jN,{E,+5P o0 ́u~*3=i"[yj ?vw}J˄LsHwHix&4t'Kp,kA#F#i\[.{Sikol2V mg+;IǑzRIjj jLCRE7iԱKn/c/U 1S/ ǭ|u"55m`1mKx`ZǺ;EKګA_?.^ BqɹN%6G!u#4 Vu=K_f5A/.x-|dY-2Y\b 02 '˝||?E'g{N>: e0ٹɄDL:FH @dUW 2pH6]XVBqS&(}Cڽn :#7ƹq[%85j`p%_E1LX3́k#{]t6_#ߦjj`` }DF9or2>gXL멐ZžGvx@rr=;{(ՅEOո$K*yo®ts]95^w%hq]aK1cX#Wgr9$)r!U'mHԆVR0e`pj!ՙMg{ ^vo67Ja`){ 26ܐO95snjjR J$c^vI7ȟB"nDEG5uY$F9ӎVjwuuœg24H>6T\R7Xea>+|Cex2?zTrT9]fFI3)w!T:w8"a.tWFY208,Œdr :[.~~h\JK&i,dS>I , o􃘤ȀFQqಣo7t gr51+7=~ G. 2Ѥ,'Twϔ J/t|Թ *SEwR[nInrH'zߤݽ;tNULqrlԲ&$dްےp kK7 zw޶ix;Qɧ ͑hqzxu(^b_φ` kG|ֲa8  c鳍XUm X  `]?wtiܜҽJ)# IWG~8f rɸŚg. k!Mhie+L62L<ң$ 5$GʏQ)4DMeKL91 gY/qJ@՞Ô{rzHd $W&IX﨟 q~pmǦzgTT6HO}a2٬0N4 N>B5S6NTDIp)klTӜ'V;u,-NڪF*WZxf#Jՠ0^**V{5H08^A(gRnZVq!'Vlo"Z["x/n/ri8/Y:ZmU8xm{2.Drz208YZ'voѷC̕ƭ%>}e;"OFy`0R$zS/NJIPbv(hQJ˨F+4wAK} 8DEu|j03}8r9xYS>vV}sH[g~M0Ϊ$A8{̌Z75Uw"K7/$[.\%Ft/eGiw N}#-vC+I`m%peTMGU1aFBċH*M3;?v.NUХTT${WOrC&i,k '&s2@n/G#?)$h/('F@{[`-&Liei,Zƨ15{defa}_S.P{ԛ7m4 `izNqÏXP悶?Co |UYcUCW t$g`S(od mO[' F`j``Gr.EEq 4cv9 u-Cr_[&+pjj`pz?~TÌO, k+-݁23t]~o$_[VXE 53/`_d<6aݭŭyt7 67>7~s\U~/qmKqZ@{`hcw\A2+wY6wEy=>؇ x"s!emrZ|`8FWy-Zg=ˡ1P$yr7.}\c3G e`ph}m=gT{*'DÝ}("i>S-/ʹKķ,/^"<_ug’y"0(/ @VHl 2)eRgtP biKf%ZNEA_l*BVXQ7=$ >B-#|!G$l?֒EڧQeaqMR~ד6R]PǽnI$8y/'(v'4 Z CGy0tT薵 tkPX օ `m]O 6kT#UWj=*}_KP} Q/4'߲++{$5b&s};^`ȑ* hO]P{h|ҟUA+ZHÂHZ KK(Mk=Z<:s [?Q*wu1P@lP+8OXޖ2߮`urꟼ6^yd넮AqCS%lyè˨:^3- Prػ&0h -D ;C4Ppxtf :@Ow$Ie24gCxq[F=̅vBRY ;0>珿~?I7w1)Ag;Nw˔Sn_)2:|ec0赺FK!6e>ö wHzS/{f2Lށq QX ]F5%s/! 73@6L 2?ZVPkVx<':s>iVT,'ٮ#|)ΜNguD5i Bl`/*SFVMk'" +FNy%aL=#A^,.jNS}9 eL;mkT#-$W}$ @W)saKNj`@ممoȇX "CZFr\PSEpxa.k+%踻DŽSyqse0z8Ir$Kz3fit-ƛ7.nڍÖE}.Vp92w1yOV3 ]z`>si2j$B@It)7$tW49c׏UWKK<7۔赉XԳLNM9믞iٕ4@1<,j϶:@4մ|6nCOjݟҕ=s`$l\0C^;d "Żڸ:.[7OlK h}MV~j|,#m[lDs=}v=VVaSג{$,U$P3,D2iG!{nCbIP52j/a[t]'?1퐹&NfIу/󮓺}w(#ku]ȫr޶́iگHu۵Hwyt~eL^7ʀBI&ޕ%$GZ(I7>8iśn TNvbhiGxF Q qĮwgtkktqmɅ~ 9 5z/=f_tWFL|~{<1U2-nLQhݖ赺 (.7Fvce쳮l 28ȱ@uZXL- a+"j?}o3p#2=4#@\'z3QjMkIml-w0Fj&4SSw]qX,cf're> D$)?n7(P F;E?ܹc݁;WmrTkVNSݕg2!D8XTiٓHs=3L 8!znۧnX㿷&&V\[O-^N' ϊ hѨcg@,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=(#^u@6D>߄Mjw '<;;2|z]|ڟzImcpf=A^!28d}sa֢wI8lveK(]{s|`JD0,0!T8hgջX8?!| ^ #8=D侟87@C=z^]!|eUUjI| j*R Ѩ4zT8N7IB>9* pr3zF7'w QWNj2Wx^ Nsa2=s){˭ .dޭ:W;JZcԜ-r t3 2ؼF|jV^P\HhIՃ5`ƺNP~4`Lm1a7r_927afWH[6~h[_Jq}?JdgN"/}b/ ݍ=5zI 졓(i|uMG_ JEaCo'7s=nUllu2Q绯 ¡O|bav|feyUSFN~23NXWr;m.HRՇnJ#YB-$sn95’;gΙ箣2jW LC#^0-SFgWⶦl|ݦ ye|7F g8=k M爉zAGH᳔iLnʣQ"m^O r_4n7lݟ'=1G x5u5ZlxIYsp8HђL7r yYY\=@/O`d5+rC&V$H 8&Hb׬]#.V(ݶq~c+k~_>]$5r4ezvO9k"xF:"8@}ݹԏjȾwg2@+zRĤXϯK y휍^^%DpGk?HܫRHP4 [9t1;$<o2xne^bvW:onSF,f3d\Gjqg4]kKMԍgq)I `qX _5A  yn@2j6Wsʚ2+ #Z8-SeȊPeT#P‘8>Y^񦌬ZA,_݀KZk*% 'I"n1/? Pt!l_Ͼ:$va*svۮ)Q7z|!qvxC,4oܚ:qWF~7vNCktt^W|PE@@ĺCbpX$jO:~ G%1A 0!_Cz(KEjܾ x瑻y,v7yKյ8ca^zXW]ioB!&h `S/bށL_okeȪIc_Ƥr /R?np$9 ha Y5tr;`(#S?E}B@'}.Gյ/*HmΔպVt2E:hzC|!|/o+w駮@邬}X˹ͮ@HC-r8}~[gFȷ Cz=a,l$}@.ƨ6^e4ӒBFܺ}.졲 ojlUYs'O7PDU o4릖0`Z/:ٖ#i' ܔU{z*7?WV몧@չW{r4*[Fˌ!f?syiF6&NK鴍3$_"x`coDql{#?҂z ͚%..ˇj.6RH*/^_zVyq(* s PӔPu,Ry1|2Rʆ z@tCSRԤ=f2=+k)[oʦ@mUn/yS<}uuyEmW܃;Gi-:<Acq{tchd&ᨖYʢLJ Qx?"ijwW`Tk>uu |tcp o{Kk(I+UB$)Hs ~DE/Own0\<#2pka  [  4Ԗ4neݖj:[f9Uħ8Y/nr+-3h|A>Zj)G,$!z(,mYVq,ҡugWFg(;sC"S^[#4I\|^l^#ð1ҐOCHʼnvc U8u!Ƈtʝܩ݈adJb̕qq],G|N뮌@﹐̺ ^>UݶzSD=QdUcN<9=+YB-$г]}JȂtYnJ6hՎX\Qy١9+F~8tձs>t [![ᮡBK+la] } 2ukUP|٣,#:sD5amxP{:[#Id4P@h&oYof~SDByZ&A]f涁zNio+?_Nvv/z:\W>d-t(\ T^Y%s+K˙VAqbY9-R}g_Re\Ixփ]H#UB$/ W{g5ؕUk _v5P 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]>3:Jr욏)rb$)$9Cqx;IV ETzg|ugMROd"~?"G(k#ed;cG?$=-o}[(Ʉ|!g5[8_2c㮌@O ų8ﺳ8UGK;#`m$ɑP@@v8eݝyӮ[ +# =<=!K<&8PcVDL5pUWئF26:=:cȪԨ;SSƜ~0<ĹYV@hT2 󎏉e?!V̺@2SFvLuwe)Ք赺Hn/;-)n]{tSFB("功v2ηm1-NI[R̟"-2>!2 ?q%g\:ֿ&7аf]KW-tKAaN}ʕHh2٨VuT^ߝsT$8={K!pQ"5oN!btB4A2X* hg22yM!T&)fcqGhGS_^H#k&ЙN sϝќ*0Mߜ[x(#̉H6 8+}KJFjwcq ^z(Ni.m:Gř]0jc iH]SF.p*Gnf?1ߢl֢͊9oUY/Od B%RwErAqݾKhnECZ A"`e5$).9ᎸFQ:B&t>WQb"Gj/I ~iW ;oDE H g&QMDx{_W ެm2O:zOrک;rۢ;`0Q]N , sHb]L}.>pj_Gs/Α9C쁞lSUa>:X  hXџ@Fb;;-5[~REP.)5)| ]b$GZ(Ik@]5Rs;j@9B (SB8ycըiY~AHc4zMo.qHSgeB5G.۩,+@t>v,%R)ɔ3<4#ET ^@@oGI?RS6h:Qsmqئ9[5,~ b@HAJ#aH>mKJsHQ+G)#kGYyhW\;Gq;Yԭ@OH\Ϧ73)sk,wȘE"vQ Mh ]pBor$|κ{?Q"}.Y}zd}N_p {ĝ.@%6P{40D\<>ӱ+#fuWq+r'ݤǷCJ~/_ƉtƫwA]}H s2?*# i573VuZ3+L^N%s:6(jzl. 2gsuz&WIq]يRu֌]6/ukVvk$]|tOG:]Xv2?0"3H64Xp̨ݼl?Ɛ_0p;Pyq#&by8+}͌WueԕVJ#UB$[GDHJ2E*I]ۻy# ep'ˢ=!%?EjHiz_tܠ+%^@@o89 byMxfaVS4mΙY?uG^}/]CpG["M(8'J $s!?#{F {L:Ia @ 1l #-\B`鈃`N4 %k{N4&{)N$I p\sLHx$߶UlLV3ư-J#YB-$oYsM' r7Z$챦D!rJzdFB음ons^OKڴeM)qvu9BX=ky, tW4߄wPDT/A wL.z\xn~[ٕlE Z~q?7 Yi:[Sڏc![s1bZ-Gy*1کR]f*K|)͘뒺tCֳ$C֎)"2kcӱ[>|Wqw#-xދkk [+:J)'M`N"YLL2^"iY%"ȑ*UPQLv ĎYL䮌\B5pvJssA)NfZ0ܶINeVDj/V@ksugխ5<5)P*oRyV-#Ӻ0΀utnȏ24ka &&v0p3q p_NV]{`cP}FS@"Y5x롃Mi"C5xF =1%[1 gDqXk]:VW@IjHVh,#R`BֺXvIYvxWFV)Vj"Syők,M!$GySwb}T)" "&o,4A-XH,5X2w3ƚۂ.bCnB.e" h ;x̌hԐA9#9b9;Ǐ3F5 G/Kؐ$A;x{$EﻁyT{1w}jӱ(,'}o:[7RHP4 cYV:g RHtfP{Mr̺ kB[HV+qy?!`m?##m-m!hjjџ+zT(LB3IffΑO_~t,#k|xS#Lj' uB-vm !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;Ƕ/pL#ttYőlg=oQgo>k4<Ќ6!.ύ.6wvY/zzm|Oi7âT}RפhY/Gkr .Cz #˪`r$ W? Y!LXdQfĝf;+8})7U#ET ^@@ϾȆMs|L^xL &ݵ򐦹ncȑ* hkWHÖ[]m/iVX4 EٓNݒ޸]7.5W& |oF"YaS\9U/l=|)1rQt>[s}Uh\EZi!bz/))# \ V~Z+^ZD.j_^+uER|8aZ>N$MOk%y):F&^`?nvo͇r;]Jy^:G"hbLC"&C¦֝auf1~ε` 8`V^Ym%ɑ, hoxML:G I4q}YOK-{ѐrDwVQzMҒW9QVPɪ٫q6J´:KCR=L8 n^+/W'l'6UZd+õ|ER9R%T{M#xV ԯ43) E~X.gu>ۇmKfQ"Zd[WfJzO'E%jGNz&k'ETT^@>=D7YrŰܽF;8H#C h@S\N0TdzSUf [y,8W=t 7Aj&^`O`pe๲:W-:'uRHP4 Ɓh4w,(Qg 7)#RajRnS/`swȪɯʛd4yzyzV@ji&`w[U+"j_x=VJ2jZ>}<{9s/yѢaojf/ EY2[λ&Kh]?t&G-ݘ,h>I5*<8@> =-|3>9>`g:gxj`ƿzk"o`UOuc2N*;HKZ| ]?3bw,NRa0m` ~r" y!?z-JMKOc9@OEt~_ hqSp{M!YKV[HP 4ېL*q~)tM'6^~ jkx#ET ^@@N27"xg|1j޾@Mmסڀ=^=GzͻZU0"~Vvq0웼LY6fikEڥmIb%ɑP@@ޡ̕@7\S{穹lً(R-Uc^b[}7(}S];ߏC}_VRGn1I}ȤV_{gӕU{ǪEʂ|hlw@n9xDCv1*܅e_5+[U,! Id P@@oE2*#O^8= uӬu/dtIZ#:g^NQ4ez1 rӪjq-SF?ESX`6e3v/붼Y*_aE{1Zx&n?O?_ij،h lh5{=]d{ة뀮Z}C<8`(%,瑯7vF-HcOf5j;ҍ`9ŃCooZ]1CW6R9$Fz/Ba h^Pf}?Z,0fco({8`{,v,bqrh3+ ʝ;gP;2׸_D} VP.V@m*PVA`VSFVMeY{vCBOr]$Gsa 4_p7uIfAW9R hƔ1tHd# s度]gj^yX)rJz ENLP(cbPsY4 rnȱn|_üWe

    RÅDj9TJcpfF d.v.<ޝk&ᄉEZ({17޼tvFH2\vTIά9xHvm^Ŭ^IT^U$aZ~}ANa   4G!qqab[9n>kǡ3YEr91Z9R%T{M=kv[c1_9NE' P*+\MʯT~sJ2$2 vS"Gj/Iפ*%ouŃrիVX4 쬙J*tqb$f̆T2s!>~ ETT^@~>S8Ov]hfhqߵ{N;71p@$獁]$MVEŐ\t5}mձ,kmsh=yLGPo Kb "3-*㷝.?38]Tj5}.g6; kw FaR(@G[^|?1xR#=C{ jZĴɧS?U y_ujIr$c-$;iX2DQιAm%EP8c' J6}QݦڲIe2znc4{Z'UscJ;ݵ-dSF|᩿IϹZ*}JZ}JLR"0 hxG'w&r&҂߃0du\;.)"2rُ𡤏ź{asf8[,ߕENz3<x <9>y2\y|rxeg 2^9Xf=et3ᔠ,y5`fM1sN 9R%T{M=:VAx5oRY[a vRHj/I9j6k:ػcEoRHHɪWrs2x}Y@5 U_]&рM^k;^g(K،!"G!B˰g>XDa9B=!$?^@Ɓ_j e]d-`̻OՑ {I,s uFj&x0~FWbFp?ߴ Ec^V[X[ kx+#ӧy i@A y|=JB*~Wֈ8pUzABXE5k4VIK.ڇ`EmFxI2/cj7[="&49q\e^rѻ}k3I(i"wuei%ɑP@@^=ϙ:!3I& έH@śMԠ+){>WQ ]OzrMثs0ezf35I8MY+,'tT5]Q$Q5ȕPh'Cugyh732=ms19 `S>+93l<]nuT<4-Dׅ4ih8*^#K#҂D1z[,nlzLmQPEN)3gVR`RHP4 rnޡ7z4quТIj}1遌A|n!J!3ޥSq_ͦnj{Kz>t|7gu Vy%iZS9[M #Id P@@{`E]@2 ,5 cF5Wss~52sJbwmM 8%"H@"~Ir$Kz0fq=4:fa۪zpĕ'`JF>:ƣ9R%RyEj8ʺcj]c >02=!PcO'a2=3cmpWG%ȸPk,Y@5`s Kb ԰G5-ƺBq6 &[Hjl7y(H`_@@mP*W9ϫZ"6q\LqgQi$ɑP@@oU"@Jg}0馌@u~|C >EdvEByV̱ls8[n^4#Qw+I%oGz 'Mʨb7k#~V5*T.U[>rL|?ޔ\o262ix&OWFפ$rmyBhi+#+N}o![X[Y111Wr*EfwWHP 4 7 2[jn@K:=028 cV1@;_ WL:Pչ GH 3h ;q"`Fteg guFq'A /Vwa.g-hr_EFccY%1tf 6&9{"=;J(6iUKԇ%REqS8딸&F(qSu0nv*R;@Y-\"=˩㮌NuoGX5D+682\^Rl )[f*4\a#"Y \ 0gRL; H =_-@hj7(ڠ@*TyEל3ຽȉ:oZ[Tn"qc>n6~6e+ET ^@@J Hz[7nKow8j@*V{M={cp|i͝60!Y];k /mJڢ :B[=iH01' H"(Đ$21ڿ7:?;PF^B林|I3ݹocK#K]뒪 ϛxFch V;f mcb&s9 (vkz³؞Е_/h 6?~zljCY:>6ʻ>؉ >3̫͊b=Lɮ@vXۨ:QƖ Q@xh/L+ G۫{h쁪cxQEWLP}ɆjMr^eoRHj/IgcƀZHu=S9(OrI{d[F.V\ڮDŽeJ|Yϓ#8 #:07GG9'@DhI?U{>B8 R,"OI݂oelgFr0X-!F}~jBCY5p2CUqƲ8aq;̒<̈ʣ.OqԟpLFP|W^!rؠ+k+g,Oʍ-s.؀1q̆?ƴ䆏^ RZjp3Dh >c@9 O̡ǡbD ~$>P ȏؘ롟]cC!FN jw=(eqݜGeQ<=0`A$/g/L;`0u^\Bk5Zy{ޔT6oIe/F/T#lTYk5}F2$9%BMvO5ԼYh>4P0  vr]:,ɇΝmt ONy MǬD}8KBbSC:I?1@%P>wgڬf>q@CzL%O\0&7]4QL#!ʆy$ڛr `p^BF*&blgH) +/1NC맟ZǎMQt>0I Xd6>%UՕ赺^t4S*κӕ-A{ʧb%uH8B||eRq꯿{u{5oWy 鰀ʣBl6.~Dhܣ]/HQ|@ .IC%@ oKџ-Pf(\n. *!}>WoJ 9F^ߙ i,򝾎j_o_`#-x() ]/rX4ֵʏ+ -$^a6T6qcwFj܁}Yf>5k܁a4zs'ImrД虽>s4SFb~(rCtȍ-! m(#ṯM܂sFMP#yLE%iTo tAeg}(SQ,y @ tH^.YKbOycgעw'sZ3Cnʦ˳>Id0ƀ:>/7iT"@CAJU$gE0 yy)sb9euͿ3ܧ)#kRUhoB uSDVR?tf-[Xx嗷NM^\.; cQE&bezM94B!Jr pH I:&h0*qJ16`H |$DF2߽RiZc)ʏaK6 $c-| n}0Bj-XD6SFפC*cɪP"VS5ح"KD=Fմ[U.}^`#KB): {9dy쩂5[>~ ]yQ 'GAV@af?RyЕ<8i[dtS۹7?Ncmr//赦GӬ.ǥu hR澻V] (~zF }@!GPBh@Vm췰|X:`CJǟK[?~^Tw,Ǚ& KJk':E7 ' N@(c|v'EEV^mӱ@O_.qL8d&}ix~ `߶w.\t=`'Id P@\ǃ HB^#:"JnI Ch^s@o.lb-%b_9W6HP 4 =5#ħcDW^mSr7)#k?~o8'Ow-#vnSl[]bhTiaus[x(WxmI˯Hݐo칮IdlY:5b%SDr;͌r_'mY5ߓ0vM+zatݑ~GJҀ:D*`~^HP4 ƩK3&͛˽r(h=Ng|Gf߅q[S̿P3NZp=Q;.?H'VcNDQq tLĕ5_`;q;RB~SF~טȿa2?CzD{pE;b9cگk?mxuQ]ngJF iwd&8Ԭd P@@IU*7VڞȌW_FP(VwjHA"3%kLڈ0 `Lc $D9 0:t)ХvJ_"։4+ЬĒ mf Ouu]7Ig%3i$GD/H6N6pAt9 X}J]Oʮ@G8- @`tޞ}~,ĺpD mv D\ȃKU}+H(XBH=Giz&|3TWF@ܗoT+ \;tg4qm˖ v]q&?5nZ!BX=Z./YWYʔּocqXUH(4m vn6IP{]lp38pEgQ4J#YB-$`E6omN]Jo/M3  P**%# rJ7]7ҽ":F`FS|)|ԚڊP UB$qf3r1rF^n]~-ˈGzJ0J#U"P$6G|`&y3Y"kRGfo" !7uJ#UB$)v8cz";s:$+ d)rb$OYNȻy{r}g\vFҲRH*/HVMUjKɩyAٛ.&aWctc-vYy },#ЫϱO=hkX⺐ԇ<:r\-pߋD0jPυX䷰}_ 6,=(w h$ɑP@@ocdo6b\-*scȪB9u $~>1e~-N'Lq"ieo]keyYsJ{k/Ԟ__+R|dm{ZIGB vͩԔwWFgOyj?Lt&:bRm?~'\z?Ow :*=ؕJ-i9wwv~W-_WUOa @/h8ؠ'uxLub+WSpO IvaI.+W^ P,ƿS/[<9B%Pu=Zpf $i5RN=wf5H#&xhc^3_:ھ m ;TXtlo!S'ʵP\Gɰh=T5/s{x˜Fx6Mټ{γD-#3kÞ se@z: hڈ{tG~AzHӥf sOg|2=(4$Ф۴3Wm*W9=Cؕӥru]9Z  fv,әK `Q#H` T_@xE!aCk lPVy?u!=gztezmhNr+d:`=sjI6+ov}ջEf_v #Id4P@hTc!XqfpG^|VC3re yֵ`ЙuAIYQ܌$9%BM=h-b9#*v#-'><'y3,_IFˑ%Ky;XQ"Z`qn̻,S1OHhnʭ&HH#UB$8wLNC'|qLGeWGvqo$8ˁarDn$f7z9H3}FWS1l޽tS!6s+sHf~T)_WZnӮ@4m{^qB+ :}IEj-QItF[d]j^"SFbQ=Syy6\4bfx6ᝓz&&C7 /D{Q)F-dɩIJ7aUhCjGZ*UPQk^H#UFG]E;=<yu݆ЕЏ!E@IJQ]w87j h~D]br\b;s/i2/RK]vfyi)"j+1bHf2ezf:a1AgMBe#ȣc0ZR- 3Yf?YƉrR7gPF 12ezm{gt4zz|RB#Q@}PXPv8 KڕV* ٜu6Y&^gQIr$Kd̲%!U$_}MY&^5]%"-NF]#?rbȪYb1:s6/%'h@Ko_:{kuqggCg[S:DsTg}>+#{qHZʽ.-nO |m6j0-#{kvKos_O9b\~7IEZmLyoז{TKSkC@ Q5J?PfuHrҢ\#L;hk״\C2&W0[jw\:YdG]d%Jf׍et}F`Κ\$7gj|1|\˶f!Y"0v,{MwPT]4bQ.vH-g](X=5 t忺AZ ,pYI}?ěs?XDhZ:ų^9YAoMdITzttǚۏ)"ziڜvM%MBCNlx[FgցEїmFP䩚T*2u$Fj&0y@qV.KM\Z+IB噭yrELjnBJzʹ]OY82kK%suj +_ v і艔dF~~~9&Nu#TfQ)SS ^6<qmb\) /oΫߊ$9%@Ej{r˱(4V ]@O}@*[Ak i,)ۙ4VN:]Z  E. tpE[FCrƩ{Ѐhɇ2 *GN[Rϕ>90t1IJyprs(ᎸajLY5=B w pAns^YLx@{1Ly]g P 34$ Y&gZx vG f_)h ?gҼA:|N?Bv;[W͍eм=^ B{bmɇ,@^ά.hIfQݐ5^x8qc%S e]FZk:̙`B.͟gr7#y9̳H#ݙ0}-u|KH"-֜EaMV=Z$[coiU58VymoY$uaI7%+ET ^@@/2 GRƃJ-v6HԃJ#UB$/iXksZ"1W=]YY͍e=HhTmv!s[\=.{[Fg&u\N〈$qyk2Ђ(tYSpC=@vHcjm 壱!. {/Yh}ַe$`iۉ7X5_B%(W}8W}0e/~':kFBs1wTOZE?!7|G?~ɀy,I'C -yگ86"/|%nH_F[jH}9R%RyEj΃&Ү[|%Q?C~8=FnƼ ߂:Ir$c-$ЫA>8*0);67A9ȧ 墨zXFE']U{}V_Jۡwed17i G&vo䦌@58z;rwx<Ц5][mzdXWz$}$9%@Ej|?{km)zlkZ-8D`#K˲ @&){qpG:j`(#{&{ɮ7팞o9_־,vW+9\a~, 0(eVi*"Xĥu.isM)X2Y$Ah:A$>?5eo]8k[W5mdN%8I`N5H?ᴧQ*Bj7k'ͦ)#G/>zkYCtk],[27CI}N6yyd TRR2Tp%99 H\1)EpH/reji5r @|KU4e8mحd)~AAٌ66:zlf:s5iO1U6SFSggBQgJdRmYXd6>.BӮOtw~qD[ώq2eN}8 ۢ].eQR"DiZU_D E z8

    m"ȁ{ m,ɱ> H KܐO|_v/1^U* _G.YB&]8u`WT|tm ϳ^')=F=D=A4% B2_M"WY_%SF98m[RuݬFsh@rpDfџ[:v;מ8ĩyAq|i+.y_Ռby!\y]u*:Ņz3o^=/VՈS;Y }|diLZr,~77u鋤:WvMr1f#?2~>1@%3ҠhJɓ(9QyF.{CbBwO|K˰[z:b$36Q&si:JǫʹK96[,\4Kt b'z;4*x<7#`%Q;P{8<^D%X^RUjCrQ$_e7T|!m*;rbPWZcCOȀ$:$ܓa+?N R{42`J nB,}o첇=qqN::iT}Ɵय.m4$0G$ap=m~u8W&*"ek9̾l=zCˢ`ڊ\TbYki slw8ߗY1nfnME|P `Y.3?7v[q4XBƘUhtԄ[F~B sj/5tedaQ!U>΢+# k;%c^Oi2BL5SJ"@\j( P;)entkF+F5zѕ3EVFj"+]>ٮJc ǽoĚNƍ5ʑ3fwj5o%ܫ׬R6f!SFV+rlӶUSM-\66q'BKm0O#i-mٺI>HȴueatX2 pCb3ey{AaNw0( 2s]$ pXvdHj`Pv U=F" @aW6Gzh~/6e,T ,=SD>3dox+hx}-]vh`S~GVYX}-,{F䋱ם}۵[k[w^xNe8O͌I $}<tra slftjUcHpǦ*+rbg@ࢃozBJ [=li PXTYKղjZI@-{^8^G`zCb9!pЖ/{7fr[49̲K#%^AށwG% nHp@cGiS/I,IFYi'JJ>5Ҹu2p,d"*jπ$D_,XOŠQ/nN bW'Ԙ硈eCbBwP5Aբ-ɱ̑d9uGc:V/9(P||r ɵ ш:,ʎ9:꘻S򌹮,̞0LB nk)RN:%99 H\`|zNmqC>ْ:FJ֚CV.iGc^_x+V>$4RY-fucDQԝH3Ud$}gVʥ5i?acrtQowxwn$,H]e.kv{)+w r Hܸ0aCc6J7~9ӵSqj N-ɱrVi 9osQ'U.ӤUM!6G'&q8y紒 ʟGH߹D9(6ٓޣFdԜ $2I+w[0q92\} y ~C$!Gz_Si;˅>78F`Z8. <%99 H.2yA%qTbx΅.,wZw`7[٧+J x/T-#_uT>6# /: 9/~ogp9Rku}`P-IGjZ\K5b]V]e\:Kr,s qIx`'h8| WtOE228륾?yۊcx>Oݏo5?Xf:y! gBZGEjAb;,ͺv4^ tXHXOBa"T`ȤkOu WIWeuhHaTG5~&uK/]دlcYK2EP<:֐0H3#$ٹ[Q gteʻfsqﳈ|%^y:f,qBk׍X2ʋNnC?BAcg½B{YF9Rw YjT4@Fx}^n+wG0^H p1q!+|,wi @&+CXcCOȀ$aNn$CdQIg|՝DGOw?F~+OX} .I0s宑D{)+-R&?"*jπ$=y @9!I@ͮn;:'ܩ J`x68yX:߾i 뒝%k3EJ0Z'؜c.Qؚ+͜8E5"y1paPǃ޻{4)22Wk35!vNK 8lKB&˞ 1DjvxX .Cƒ xbٓG`y_y fܺX+r`e< {a&pEW˿w-#>wO1;giRr,fmt<c?+΀1qr,6$ Uxs\eCfHt4Ov#pXR8n9V9T{$Όcu}9̲]si`#ugGY8[<K%='+CQXFF9Ps02o+/ilVngNp.N"ڐ]svu |`*ҳצU +֊Xk,-KExsk+G2C*Zjo8]65֔t]ۓMًqF >ɏ@ kIe  !}tK T9zG^T0 'xSJ\C²r&YҩAXP8|ɶf=x?7_fpk$t:T~|OX3Hk$/e{5vOe~ j$wٓ7fepnG(~*a5s<Җ9V9T{$n{' oN:T휞*ܲvm`,i*CB?[  ̩o"pP[.3Q!JG3%we+l@_ՠds!8 Si\Dܳ <(ɚgiSpԚb(#_dHBLNmEbmXR~;TY2eתmVRՑgqgoMm}?;sNJOFe֪QXI]Y=/1^ 1^gVqAْϪGKr,s 8s%*xTmZ,,4O'Y^?` .yXc4m=`NJg(i7 -=}R6"|f⨖3IXKr,s % B`umeUzqo8`Cg@Ʃ]x:iRͧN|CWFt*%KWj ͔4Yc#$ $4{kz^Δ#BVEb $#UdU:2 1"(G$s2!m1x| YR!^\9V9T{$θWayڔe88583\W1aֲ~s0ׅ}cN5X2 pc* *B V2ժ|l66/o$]%wY%_d5:_vt9f (ygFB2iEfkW,w*^ MԜ-UvȳF]l#u5a=. "~j8pu0H<gk}"NK /1&GQw)ˁwW#LV.-U2Y0>ɒ z2vzKCSF#H}۩$+aؓA=].jgve8ȘAXy/0]M_`8;5{cn]jc6PFk426צM2 s7C 0HoPfcKc<)" *[Rr̼dELb2e-$Os!Go DB_F2x̍uO-gfrey >0 N + Gd'K-ԶIC3SF՞:Ft/)y')<* {z9T䱈,c Yiq"Oe+;?4CKxW/3AU=Qu>?zl宑Iaa9uy{n[(Rz422zY=!TLRd}mZV.TI.mӋ1LHq#Ҳ=X|omJ^"'Fa4Ƶh_l[;2z ,ǣv;ve~`Cg+lg0&t,!4uYe 2Wp .u@Nt]'ue6,x!agB3=밨^SF+uds|hQ^^Œe8{8 ?z 1&\AuӠӨ-bveU*m%NZo{z+#U%~ 4Wݕ,H?*nKd_q4k1JZ<ӡ9JFr*) 2">H7:ec ͻM%2K۴eda6E%fiiY XXO`L{W<%Y}ajߖ9e6y"ѣW2t3"wЈscleo\c'v<%[jcN:&P,P?X͡yLuT$$MbզkhI.u S6q20`k-/P"v_AN*B0ꑕ"xdGq\q-;)#uMrfOPSD -;SA癛d.oz8 }v/ƌY՝G˧m pK530#>8ý~FGXɽ~d8g0t2DƇhoѕsc+:Y9u*j2e2.P `"_}qHX|ï^.FKorl׍]u{#4 02 {HIgҙ;P|W%t=_3SPd{<͏)g)KS[`GWSDzTwoĪgl9krJL.IBϺ*Cr s @Xg\!t"|$rvnk=#rr 8(;{&^HsQ;йH9,/P1LJtFUsP~ٌ4{FiGDVv o`ℱK6u֛c#/8y7nwF}g>"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%"ijg4l.I8ul.criܦEBlЗ^wbƎ.*Fd'+،kNz;\ +[>?/݄I/؋vBR3Zލ I5Hp'ڥJ;|{Y9V9T{$μ~MؿY=4^e?}H,uR9Q`͈Hrd3bWO_+<:Ɇi3 ڕj/#P{4 $gKٚ!(V~Lv7X I4FFꨉEĒccd1(2YFG۶%qƌ:ND]H6`kۏ$WA ~!I@o3|ҬDtt/Lj]'WEGtqͥ9#MVu$Vw󦻌M"*jπ$++uM(BV/ˍbP&z;U=(k"t$Q+Fj?O|^"-C:XĞ.s $5pVJ6&3ydkkHhCg $g*rN6|히Bؑ#spޑ8JߡUTF"KF l}$2IN*;̖\M[F^u xϪ+ԏTD;kIe=!76 |نΪ$u#e#adŌccXΦOlUckqX%eI6жYc{B$n어KHm5Tgkp֋:kIRd4@y$'N5.H5GK24O2qGk/}xBF۟#?\}_~M鞢x`f*AI5q j n(5OjoqXv,ZJMYX[E8{VPK72guhݫ{^]cWF3Cv{Jne/R b:WxmFoj{-OH20x2tZU[2& 6Y44ɪeWkCa`(# \N[rFAO1xqcS;^J`h?nѥ' Yq-[8 R<ڄp\˩{0SWFkuqt m%lv&}Flx Z]?} `3.<̜ιυtH?}\v٭jE>rlmؙ2IBk5?#Ty_2;ftea9a9f/$6:#ka$f!DIX\FNQ%ÏEM,rz zo~J̰5"4ʡJX_֕աE H,i)צ)eX+rr H\JZgkNEF\)_\VXjπ$޿xI%lzϫδg>Eρ\Zƕ*[W|FKr,sdaf/30^`T7Mm`ś8kƼq#ҏ{Y*9yҙQU?c"G1W~+jw Wg]LXViEeqc,ݪ5i=e쟳eT=d2Zi~m#t/"'l4|IT={)12=fSx^uXD2Ů+o~#Qicto_;{,ݿПR(-eTi"}^wO ͖(4|yP ecO4Y/e:AS1ɤd0"}"I 8 >4P/!cʵ(˹4YdYMTrJ++J$߽0[X`U( "(r6@{G@ nWYUG6o2 MۺZc$R󲶳h4qdV\ֻT^9V3 p2$ǂ|ڑ7$8 GRbġ̖y/>Hmc72jv=j$v!3rL# YXy⻝ɦ\p-9GW{LBk4A`i}_ȋ(hM 4r67J ;6e.YO&%XBq|YKr,sdac{ˁ+RLL6"T{ڏueָG!%"%9doQ}n_(r:ZԪxmۙXHxnx"r3e֯Sg7'-#'r.' -#==4ksI"njW#kjKS#)# ӕb>}ҰP| JΩblT'YFQ}= 0ԊZJF5_ȏ N8 +rG/iXFnFzd6ŨymT9E2~֭ߟ*ۮ{4\6#TMj(# kFH?/qG{ aWaGH" ]g2:Wo9ZUR*zĎHr:~s:qR9..iJWFz7'A@NR>5W/}<.}QQ:v*F^RH*Q9bCW|sKcO~ hMH`|G?Op.#'J{g+ʧ&usCr 3OXC*C 1tiN`%Fʖo?GSt1E(SӦ&jj_3"[DZnnK`{BGY6m%Hy*6Mk"*jπ$#x['Hk V)Mz|H%;э3!t*5o'V|s%JL~]kmNNN`(t:%n4k< oBxlL20miOo 3'\997"lB/hF'$IE7 17\^>V5Pۣ0/;# ̨߼q>#o/8Imj g3ߪvXF+mm9`*mYY2\뗑ta/U}G _2ZSYFY|%(D+U+[y*`'` 1̑3 `㧀#G+ز.t(#8ߪgϛum$gM6ߴ.6c#glR](lCMcՅ@=O3e=̧7Js;ޞt(NL1 d s w=4U^䕵̡'d@Q\ U}#3GEXInwܥte8ٿ!b<#a! @n/2O2OEGͲmugXcCg@kYWd9H,Yy.I8?{!fFF9Tw@X`0n3x/ҫcw (B漯J_?)Rړ20\l](7 N!;4E#$ovc, !_C*4_7r'4l(<0YGM|@O2[3Z3' M?{y?Bwzu¡"qBLZ/9V9Ry Y0$\[ݓGoO@p>h/|su23k 1XƞI~KyI.{: qʇiifX4"= ;{K\{-55XW HZcqؑuoXEI)G X yJ@c/ 魽 [؛9/xwD- *e0z^˱K{%e1KkP/հG5"(2^|D@k[jn)FnN>?刻;]XJMe=yk֫8E5m1f̋, <,3q @M΢&ZJ4qwebej9jBhcC8Ⱦu,_?Ȟ/d۞P(ݯ:M}(,\ΥTHJoP(7z]{m+%N~2ݕ>~#| `, ^*^sTPY.R'A\8v'KٕKRuGVpmWJzkPXT&lG"ܺ-ܔpU<=)# +FF 5@~'d>J84F}ef51y}[k&ٵR+"@Y_1 r/3R4o ɭYHŠ#6V桒atJ>)# kϕ+~t-l\A#.p_Fv_-]r@NI4>g*bk/,mYVaJy$s>l& e{lpmn%ZD'˖ڜJ!' *BB(pmPF59lGDq;\96ȼ3̲ryz 'E׷S ߸D+HMSD2ÍcTgȸGv1EM#Ou olU9O&"h.TԄ +Zwi:=^2SGva0UuߋjiZspl;7Ǣ1zɰ)'dkEU՞I>2POL(x=1qLkߧM'k㫛x)a*;e/e삺@/L/]6dC'4_yj?>ͽ%/JBx1_Gz!~{5c1l&s(;.߈h/v2vT15$=E>BX=!CR#'lܐ 3 eؽZ枬2,,~ep::YrV}C;qZkIe=!gyae/ JM!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~+257 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.Ǡl#fxC5Z9K˙/ Ԋ{H1|MԎsDq Gp]8'i%2 eY"?z%M&18ǹ'x2yVy'=yHEZc`~ 1 @WWjҥe݊d9V3 p2]V\'Qem N?0끺CMrs5ү!2JEARre2&dMr<@>Ńo9JtRz%1P$D r.'ZKiElWٗ#:+rr @ͣ%V&^GLXUvMr |#d}7ilN5["K̡2hcWpݱ=,R:1,D>G Lf=KeR6Q1#520xD!?7Fk.ʄKN $WɈH#C-d$3[ 9){B_B}I!B#%KEF8dLtyIk‚-mƬ]F[A7t ;_≻Kwyl/-R7Zjvv2SM%$G2ZȠIg'Ё$Hs<{aٮL@Om(FyA_}84M{[\:2%8M&N$j$ɑ̡2h3'ّ|UyNM5`H0Yr짹8u)*e({N|„rdI?5/҂ hԐY#U-ZVkJ#<- tL=CLnΩĭ2-@/q^P3O2ryMa UkY:h.7s&t= +0>`,B- -~z]wcf^ fo@g&ŐYǻ)Y,@.8m.-=<ՇbtEA'ۙrq 8V\D@0KfJ֮xGz쇸Eq]@ ` "FIo"g&Czy ϒ& 9vV? u*IQ_.ԈˡFd?ٻA7BB{)u#ic(HA{pA*G*ϠHy6xcm^lx!/J]!6둽Ǫ^իܟ '׊"bzg=}@,zb=~fTSE, ި9R3h4K0:-t$E?Pn\fCJ#<"Y5b:C(#Rnq Kr^x;9R3hq( WVhNç@ `r) pΔU!5B$)1KK65ezYM/lNT8/Vj񄤒PHys#!(ߨ}3`Z2L`ΆKrs6R=%' `{c|v?$Pw'X#h{[v#;SeMuQey"G*jϠIg] /[3"LwFt;:\c&'KC3Kx-u$Ge32hhKi.'[`"}@s09[n*~pW ? fɕ H#Cg$LS EZ}+ | EGdh%20zEF}x׵к ī^:9R3hQ D !#Z'oipA_Qk^%Ђʱl$yot,A og)!W?0RHP4  OP'<%v;7oEl1oIpʤA~ 8'BsmH!՚w̡0sy*R_ZbA{r`%}lw@!>JPFl1MЂV۰ Y2,̶1W ƻN _\]Xt^-Vմ hTj}CX;kc y u-YBؾQTs`TuHM8J;J#C-d$'i<_N-TXڠ}3`Ҩ;qdNLk; RD1L^PF׆ n==`{>]5od_A?au'  l1u0tp&< ębш!Fs,zZd(~؇-YFO @0 球Zߵ_dtͽ<}6Qk;Y\lWbNy+J0 ##ugP$PkRIkgA!b^:-j3g!rBugP$P}=sM?+ca!^6I aUXbc9+soۿ6Kxr9Tj5sʠON6iVxه[1f RHHɪ:@)nӄK\l?+C(#5gGe?~fSjvUn^]sc4wp{ y^ŷ=g>(t.NJ@QZ5Hj;Z&g(# m\-4@ )yhr$99BM?vY96S(x?"G*G*ϠHVm Vs{ݹ{tezŰk>(ž$Rs{R9yZ^%nn[Fפ|IRAez٨-c8Bsub g>~ض 9מ0 Njc<Ȥxf6^%L(q&h("*ϙ?\x[+C0d{w[p`y=ϫ#Y1o8< YNl{>4@|l KzRK@Ą{]jIr$s zvZ7,j2ezMj-^MLߏEKm ).󪊑OUwXA8CR@c1 wSbP[|Iqস;1b/?8bQ8S|st c-E^2}Z br랈6jzR|G;|[Fyjs̓2j١,Ֆ ޞy=3SxW A>Y-dNpvtǒY)7 65GA;tP9^'ː#^xF<"Y5.gͫ%)L~NlHJZ"Q\KԳRDO"Y_I#=&pZl"nmI~3/ sJX̫Z,VjYr)"=r1c ;vսicCAcBL+{J)QI_c6LpL,'ND+#ku_ $XQkUꆰ+#г76}. !u}.n5째9Z>t]3 vꭓߋc&SFH渃?8ty/q\p pK` &SA-:%5z^kM/ރ$99BM[ ZOgu1e`wLj"G(GΠHfkv$d涍gwSFH*3xgEL8biHlQ Ȫ=kur1+!BW~9@ΌDeAgr=D#fauG"NI/n]6t+fA=&8e.h^y*pf un]Y6Gpq*8`@ n ?o, CoT)IK]OY5)܋q/ѽB$qw81zNjԶeXlx!n\a$dPW9ᯮV$j[妌@A}y:+sGPj߮B _gvc}!2Ҳ#ٽ^bwфXN5Ԕ#4)Gt%SD`wFIr$s zMj$]47KI* !&T Cq;@'#.< CHU?zó=Zz5 s3 > vJ]a/%ƣĥI_lҢ=L3=I#Cg$гۍLy5g~@m7s݂Z6wMWFg:ݹ&ȁfeZuvm$}]%'ޡnmv_kjΙ+ב'κT՞A@o X=rLc-yYfs8"r&AWI0׬Q7+GZphgjsOy,#Ӧ)(J-k7:3_& `ljYΓlȓ=uV-T^,~Y_2BB9Psjd߶s3aA.dG-'r 7}ś-sT_p‰瞱ι=hV"Rg1Ae:mL )hYQk%ɑ̡2h]sdY γz!IQjI8+rHyh+ET՞A@OA͖|>;у /+<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=p jH X(ggjH RegA?=KmղYj6+h`;y% #1i!9ʣؙ$@%iRh@ $;{n6OF)#гZ,KEgr#Y̗U~$G0GϠH@b;KŪ_e_I#Cg$3DgZJ%¿}9vA[5ϟ /I0:6E` g7edմ_SULSVB.]٢(g<H ԊDTaxMhΡ+%  V@m{ɋ0ӥTo0ekezfr_u-&qKAC|@A{6Ӟ66z2$U=+E>L84(s|G1q|RO(d4=k?PI5KjN(飜DZpqUP{=?gv$~NB\.i{NV*-Ճf;crIrڎG [)9g-I&ka+1Y7{Y. Tr%n4| P՝"Z2НnZ={Ɍ^b/E$ƑRK!,R!A0zHN4:%f ԁ0Uu։M8ˍ$G2ZȠIu]J?*R*}V5Y!BP'rx ,!nĻrZp z1ezE~aH^[\9Ӵ%)R5ܔ虉zLdvI̲n iD#hQ~;7cnMPlƯʃ)F5幆 t'i ^HL5cwFK9ڑm 8o>g.195/Xl4R?쵘S[T6Ba}8pp8ցڳc~ &H_/||V@9/!76ER4l霚eݔ}#I[b! R@2f4_j:'EꂌȆ0f:>wuMtk%Q,%X^d@Iռ ."JEfg"y"2:w&k7^+įKsV~C_fHl5z"upmF$stz#tBӲH? 3^~7<ݹ{CƐł'H#C-d$34G| 1/S]CQiǵ릮Sj"G*jϠIR@,zV5)G7OG]wκX78bP)Ahdܛlq)rr z`(.O5Gps5]fYaʑ3(Uy$4jj^twyhf3UK|Yrˤe\v$G2ZȠI7t, n 7@88EZU2_;N:ǨYι'{7c~t_}7Lk+E>W.E~Q]ʤ qNG{NBVSFZ6mQ̼2TWԕumZ(H{z͖=uFC@w s);7ٔR!79~ԶoBOyÛmLpmYn(!|.P'xK-\QrE+R!Sz-j˅"X C$s*XX\Wu[FROQD,PF 7Vq*-#&R_tp q(#֚iZpWmNx]%&q=ە赵>F.:vU*=;7q>\? HC_R Jw9n>Bt 鰤ZgNjƛ&0n$V _=fG0u(Cyt1L;CL;IctIuoigFd`oO7skt~Ots^7v&hT` T`h@`r.H#C-d$kRR%R%}u@X4 7du5/4.O]I} YȪc1h2W@MUMedś<|_օ?E/3h(מR=(LK2R, : Ʉ8ʖ赺ذano~SD̄]ao{5s=+m^*Bu?<[h}v f}$U߉6/!?D2ktu8Gn$z }OSfAT,Y.Ŕx3̺6+ 5U[V *no4,wľI`Ou~i.\?$99BM/s_ 5bE&$H հ5ɍF~JVqJ(ӦH#C-d$ChjԽ^s?&9R3hC 1ӪC9m-̐ `EN켯QeZpWZ 0٘B8%ܭ'-^ g9R3h荓9M JVISFsG?CtY! +N-oilgZ{1P'GEX;SFړbnIq)CL$GҵB 4_켢9 I,Uִ*%pRHjϠIBx0.UVBjC{LAo9X%3wLߤ`N x÷w{vR0-g%}5PL#/H:<"YXm~Q1Xa4{!Mߕg/jT[bp9.yJ%W¦@ \vMU|kR-C'>{q%bДT\_VKOAA HA?]760Y\'赳xgcoҢP"bhTz-F}-󁢜-'*DtuZUZA_|l65@M1ɚ-+!yÙBCuTXOn$JSϰlW4$Q"!bGh!G Su6pW2g6Cնnted{ih<0Vhp l"LŐ[V\E7fi4ACGiξfO$ .[%~ GnZ2G#]`bHnӺ&Ϲ5+6{™>TFm?&ضehqWOv%EdS+SHq ldn)INZ`E1W5Ýa^xE!߼̟gТQg!G)ژy(JY5M%12MvLC=}]}݂>wO LbZƮm7>N4p7<|=<|CwKf$kDV/vOU]yl]G#(6[2 .K̞ Qw7HϠFHTEhIw\v8Z]mWWSFW6¶c.+ǎ0:vV+IdA@/0׬]8V2BiI_JE#ET՞A@|{YsZ}*&+6oW{٘cq*zu6⳵RHP4 ;l8y PrX©d)Lzq.S9aKuȑʡ3h5!I_v]yD dBB4_uBvZtBkȑʡ3h,Bݾ7OFYe-+9" jJH dp)Eyȿr{M+/zq ^.y=z."dЕɔoo  ÕdgC$sy=<(c^=d=qHnR `Y}r"an! H($u1!3_פMHZu7m={f_$;t@q? |olKR.Ga4%B*.0&DP zd P ;vաNtXhQƅmXu0`oEh뱌W}*@Ovm@Q>·;.U1/mYIr$s z*W^RhAKVOr1edvrsQ$OʫݰRl%ɑ̡2hٽv$"'  ̥l_HPEq4CZ* tWUN9R3huMe5]Ms )v&c`si5a +-pȺ3f?4TCԲ%0=KI\S6Be5S/dR}d>`HM*XF="'D)RCӟ{sזK9 Td<4' dZMf;C䰨IHkKlbgIq~ƊXA's_\8ֲ"Q/5?91Qc@{b]4mxa<$GYd ÝxM 0;|1L˒7TE}rer7fBѼpy@<"Y5:[n~aWQps g^ UFQ+2>B!X$<>YGKoʰ/sys/(DPԝA@^.Wb*dQS2YT ř$ˆT,sYF=&s:t&oзA6ezu*C6m.K]!~칏̑3(#yH}Li3k033 #r]p>[[vM/XTƠډ8۟z ;{ѿ!d>{dg/gNᴒU7/'4);C!y|* 99RE5;Ɔ_wc~ +GqLJI>xY@6/f'Rb`}f[„װ؎b*ik;4ɮX)rr z`9;lž84XidәSehbw"j3h6H0b_ aӹʬWF%n_H] 93(H8L迴\׺fnQm4ԋ?L W{r]G)vQj!&~q\KOK HLWjɥx9&/W>/9 %g3={j=TǼ"G*jϠIWޙ &xgj)Wʡы#74f %K)b?"3P{>ۿ *B7 `ElY5]@tAC tx,&!awX%g ۉ a󥅠9$99BMǻlexo-U\d} QɌ9R9T{Mq"#2%ƖKge6iyqrW[9m`M7LFAB?[E5#zq)szPU%$r:Kcc$ɑ̡2h93*`o3ܿ[z}/R>@䍖 A*rx 7i^-NX8o.玛fyu֕>5ԘghRvwAǫVU Nqz#C"3פ&H,_28_| y/z=Z󜂍~ty@ cGl #qac) j#Գd\sr䷲W0ؐl^O)C=1gֱ sW3{Q3ϻ9=kx+S96o;הM:v- efUxi9)<27%"}$G2ZȠIɰ:\1,׾4Z By`!貘8=nB 29XJR~iSʿ![{]x@y' i~^r^(/vHf.";#$MK1{nEZ/*{Urz4o:4jۯ-;[V"NFFe%ɑ̡2h| lu(mgn/~mQPue "G*V{M={$`IJie!m_ȷ^xeȑ՞A@Ofѥ7e;KV]Tl%8~ΕJ#=&!7$}`8x.ITqI=5"Q$99BM=d]` 7.cb1ez>C!h$ޅwC3u.ͳZ$G2ZȠIW[3I tN@(>c"?zϺHi}N"en/Ҫ٧I}b[1V!3\ؒ,K~ =Qs^b/1Kmsd X8p;gv"dEbQ@8lV$򎵢8{aVw`t1߷{37v< L=9R9T{M&g9K{KZ.GK)rbg$3=_sv{2"H\Ցꂓ_P$JN+ET:Jy,XYAf".#"o8߰{?ZQ`D#¯  =36\t`IB.{ !y'KYh%ɑܶ }S:̯[*>bccOF~B:OȪ]GA`ؓkoO:&".M.]CKx,"?</}1x$sE= QI&aI&Z9ɦ>v$G2GȠHVͺMbHg)AT(&1KnQ,F=&^p<.,tv*Y)/w鳊nJ]͗%qhK00NU$7 *c~%`k\XK҄^t$iBt>KpvI1HP 4 ݟKcXti^L3bʼRQFܹ&)A~|h9Na l30/~pyOxYQv1r ~b:4;B&q۝yTh=~ ET՞A@,$5}l4C@$WR'mIA3zthu-B = ]kVJ)ڞ_ߕ_/I'UX$s%I[b!8kk]EMx%VkOm${#y2"%3'ESD|' 287NެdG;^Owe~J{GұPDio ˖;8>W&iL;V2ZȠ?.F|0*q Pe X~#HZȠIgj\?3E 2jwF+sy/]"(aKtdS'poomI§@-Tp4%"zje숾TFI64̽,Hdi~7L ~臕;~u ۜsmsP39'67vE~ė-Jֶϲҵ,o,uI{CU7-Hn q9ʗ2ɷ Բ, *HPHo&LLq1QFNlـaPe,kA؄^~ݫ2&_∮ו[@2M30V6U1b$G2ZȠI7|qlf_Y`zv7cÒbCn gnm_L.)QH;Te7yQ:jȑʡ3h g2]t)v}<)lY]e_4cezH*٣ޣ7vow6=Hm2jՆd(#+ʆmxWvS98^N,Nx$U8I*_H#C-d$гmcB.G]p۪[L{zm~\܍99ڸD0 LĐC'qn]ͭuᏻ(kτҙP禌@-x$v8+TJvqF",C6!l-+QB#ZA"6>񄹰T+# `u¿&B%gkZMkU*]g:^, n?XȋQޠ#12hAAsJv \ۄ gB8 s!P3A{_(*)#+R ,> k1!ؼ's@$+?[E?oKï°aO'E䒹u#?t:WK̵ezdP>͊^?wH]Y8 A˨3׿m@a+ד8eD $筅2jmI"TDkI_w_ؕ=oHXǰCJ2jв2kvahy?Uuez.yoǟXRm6`İ&AƁ|%}*Röx@oOHa:Tl ['+dfJvKPMab<I"5"#C%_:>@e vof[ieI$aO֤dGǵ3g1*KUaM_DO#1xͅg Ay \ky]+Zҵ=$G2BM{9y/)nf 亜S,6lork\+٘Ԙ3{$̡U$P3qTIF"+4?JD/,4""Dm9T G UA8 SԘ7SFk,vnG0U' S b"+Υt&G1@&$3b{ b$tEF|6}R(wa )rriHTfja K?ʃO)@C/ NtχZ@VW[9Zi/}V`ef(o>iSaYCRơ2U2jmDGiZN!uhhl_r^^qx<77廅p0d򀛯C;5xOY(q!=m}IZ(Fs56Sxt`):E_1cL;juWx5  h!{g^xL sTSWЎh3h=Ӥu=M-#k}oyqgtB'ƴv+?[ErFgv "i,Seb|HP4 G8%7[Ps篓"G*V{MqF\!󵎏-s}#Bч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]lo6n.(н0@`O΋lE -i-Pk3z@"aEug/a7ۀ0q[.(D>Tw.6C~-`45S SI@O[\V[F5%nO]]:ۣ0" ̐VPZIPZOc7P]-3ΙF1  P*k8>3~M:ސ#xdUf6vk.xYx٨BG%c2C0}Uf Jrc #7Y[8)?0R{4q?ds$1Kr/OM =K ESg1F޽9i,c r. -ף ~2su< ~kFa+hEƂR 0 ڙUr?隊7BVCNuZHAj!&|<[œ Aޠl; ᨎBH FW̫2ΖEA\*`:q^!BFj!&_NƔ\BjL`8`?KK鵩`m 1BH 5(G[/xK*2U>+tHY^5Fh("N ,p}E=G1/X(è .>z "ydNq`ds?$;^6;aP@Dw$jpGA1F#<嘁Gc!qD[i7-wK9\J;Jtd-U3rӹ]XO0*=G/& K9+>L+^(DPԝA@{4#V!8 Ȧ֡5`ÈBҦUOgH^{0$σbez § ֬7@cKG͆JXmyٴ,K#m) IznG2D{{zN-1g{ xH##gP$6 DFb_e&,΄iiZsl[4xЎAez3O96>+GХS`=ljG#`ԟA@m/0׏z@dJ^D}0wR|?z';I5a,"jB@eI2,[L]j)lqNg5NT&I]Z@d`:mg&=E=7.SpRdAC\M%c-s)F|L@ 9׫opr%w-wNK׵마@ͷ2JȄJnOY/vt>_וOh͏s+kF]]v;,L#qZnEgg khZ~Ȫ=+v!PM1eϴ^k&y~(H2ٹ(a#̟gТQǚ]m SHݓa/p@Qy&EN@~Llv]6bI]yp|yve%:W<&EV;f #DPԝA@^b @<9 e;uBA*jg-{Q#>#LԜ{90+56~Ώ՞A?zDq'D~cd=lֿ2ߊ/TD)sӜ,–%Ku2jd04y`h>,f5F-g$A5R!v}v6'0IzϘZ7 ]>8hSɵnYX,]]{]^$L̵u:l5c^~1&SW᦯[@OFV{ z.~mu --#{7QFx+{b0 B\1ymS^5[A}uepeB C z0}r|i ޽6ut9i9,bpzDA@.CE_pq9I_i\@ =.,\*X&Ʋ,Esj[ZzȪ%o?~U %&Փq,#kJMBYp@ / ؃-[qT(I.lG !l( TфApϚ2g f>uqkE/0@V mrY]<6ZWGSF.t5֭0KU7K4HZȠI6dL3!|.J`9pjB&ʡ3h=Rנ-ު'?JjϠI7Y23&_̹@όN܂jNz-ᤣn8B̐ prߖPFWEKJTKcrϏ{2mjh,N!7h>Rw kC{ephPx*$*D9 P*EFϾRU{kelHc|C_Kt^;"ڸIx+9vy++a)#^qש"4rYٚ<1J#C-d$YwjB%Vx=2="$!@ qeWϬ@ssD:]b he53dP՝"6C|WYkj뽇~w*)@*Bo!uqF-2,4r;W#vX3jOsDjH5x@wP1PTkwI.biyvcW!,3+eϠH.|a {O6Ϯsufs2={pQF2Bppމvdn9ѹ^1򵵼ⱈ@$miRGrWFl&r"PH؏FZ2MԈ|YwfN2xIjh/鯭wҖU>hfs )MćH ¹f=^~@&_,PwEN!iLߧq9ib۩I7csC䝚*-Y~.OZOCI@茆La z8&ofDVw{B8jMNw\sH2B~֝Aѿ}Mo@ y ^p Cct@} %[nقE& (hȑʡ3hEfl? E@Q!, b0~-B>ganС6|lލCz>HPǶ ;h53yVّgc|\Գ!=1(IdA@dYbn3_SنgXj۔P8mש+vK-lH͹q 0CfEL${;n=,2I/4K:1FPjT$\FEkZo ]9sUW5g牰,C~VIy]Ir$s zvǙ4(]g6j1Y"VcO}|`>☘%1 X=&޸9c0^{C[7Xӭp.kǝzlgar3Wux4 !чFi "Y5k.g Ce%)xgXoF^OV#DPTAV`~Zmdv(& B11Z䢡8xG|F:y+~n4(#gP$Smuf-i/"J(ӥ3}KuZRHP4 FEQq7KlJvϽƇwBHЦJr>s+IdA@tN 17,]bzirZE94ezo]Duwmk #1C# aEOJåcL^bDOԲ<-vez.sr=F2㩫+#kRR^*^/1Nwg1wcT#|u_C-^hD᫘F x}hr}|;S%֤&,I?G-'h=LHȿt. 7rCn{g NEtLd@ltLol@`FPXwLNO~ D.[C}Z)˒]/S))N81$؏^b./(dܨWY|(X*@7x !BfK&^/gdrTNfU_94i]92U;[F'm !mŋ6b@_/j6D٤2 σ&kN1복w*f}}OS a.ȷo[Im$ɑ̡2hğVunu|]Y5pR ՚Кk^f @٪Q…S-r`vn.%7@] ݅,1z֥1 f¸}UBu!!Rwk0`wļ=kdvu{Fm\lI2:DŽi7ezO q\nD RP/RJ_\|^e2=;՗c580-*/_*~KAO6A9RE5;m7 /0^hb(&RE/~ м,îE'F$9 Q"G*jϠI=fdKRYc?1ѯq^z'4>+k~_<^*L ݝ+#k7cדApb)zF&Woܤ7VM^.`H#j "Y5{ٻ@kv~foYg{s:Ow|Vµ@͆zKAtz)4mjP؟̔Űwq.'Qìޚ`cZ{A28^{Mr['_і定2&\h_F!SFV94o?Z#:=k ;d):3urt?H%m6..PtkmkO]sI炸Ogum˖=R_Wljzm$@,rk|i!N'"}f^9Koٜtv+9B9RwE: qw`ʲj<ɞr*Kk3FyIɽ-{It{hR:ܭ@{S1PF<7u?Jr /9권@ eP^[kYY&xa6=\ӷrezF"@q0C8 Y+D>Y!0 W$d%u%oŴezgY͓U! V_#<^ru܍jwϒhݥKEZO,@#Cl#:%h!&a4פ7aE~Yd?hnW+`9Y͠+F2#H(zllFҤҮR"J=%  V@m/0ɿ@;SPoD,sے\+P(ʯL+<vo(v;t; E%~Jq@<;52Fc2jnIgk1i-+vtQT]^&}(3"W v<8й%10Ed|+U7FS[a7?i7${˃Vko Ŗ 7{-MzS%A#TO4d'>!g e^2PΎgB-А[g]+"jԢbkh$Z":~Q?᪟n\gv*#Id zn.'Pҵ"y3oi,#len"lA[mT@N> yheddH#g$г3~Ko粌ޞM;nkJg{V)S3LY> 鲡U7s|}VvZ"7+iyl, 1UPQk"G(GΠH6>% }Nxh ܷ6ޢv~o3+5BE!j^!gc; oHf3zyluy-{Ӟ9Ii'=>@)ksl IL%}{"sp2s_: oTܫ8훆KSFH Hp@ϱ?k\5AqbAhe ]!g1 #Cvl6d$z$ ^nx6adܬG IzS FFgu뤸9oFkJv-5*#]c-uoU 3 ñkױxK*Y9DJi2DE=E;-dދa+(d vxOS]l@Mk P׳ܻ ~?R.$/"gB{ Q"nGumIZzU_نeV)׳tOfe5jU w][v\R@&Եem)h'EKXt9~~/E[mTJ}23ߘО*Hh C[n>·P*a asXY `:^~VIC<@XɰpW+1 \մ1yc1MpГ >u][nHWTߓ}6/SzbQRyV 8 иz'>Y n]5B!>#}PQ0/fUȡuh3Ac ΂130Gw+};Β՗{6ז2|W"CC^7r< Qͤi`P8w X`{ŧjCQ XEc[}v>HŜGn%3~Hz3DG㾏m_a ]\O c LgBo*=g?HvVo}sh^e oUnyt*Mju5tl/L.{b̈*P w;Y.u>>rˤ*tNlˮS_o{ f٧L~j `$r *FLepSz-KƊB`‰>/[IPKhk w?͘sgP}(RᫀNPJȍ ıc+ýο:;*0ZebB'cVWIJqdOgL{,CdHWHx֢T.V ~%ڞk]l¤^})?npa&8fp?tV)cI}aD0~fc ӣ,9= J1٩Zm3UuAHז "Վet7ze}ݏo1 n*u{>ۯ230&P9iAԥc[?bBZ(2 U޴LFCqmf~z 7L'77Ez Ybj]uYLԺ&*0.ה`LC,fs=sRɗ\[TlOjй1wkZ_ݦ:i"s3u`Ybx~痡Yfb޻OGq3ɖr~n\:ao$'DweSA Vr*[J:FL,S wk痭d털Xv$ܽJ~*X <3*cDf'DfA7mBDoQd|TU2]?&{sjk~V.d@x*"GA^'_ ܑEQpBAFN%P9QTmז;zM&k LX; %$, );C|h(c`\ BF<Scu:>నD}S~mO KP|!G4'Jf]ulY)Ӭ&`#蝦9߸@x'antG|Rȇ_{_RM #%'QIsV HDyiE:aRs*VGc,~BarmڨA FP5e"DWFB\- i>Z]wm|ilyBNe+tfV&V)_Y2r o23SeyMD35OrE_GC)3߸Ijl,$dZoFL`Y|!P98hI+m2Kۦ" @58-&[L$ 䂢V'ܺh՗=x)R5,갟~}2p&.(nBju}:fAJIKPol{{VOTDST3f7=<=C7+q=@@2jG 骧!{>QEajgrXxfN0|J_WKUʁU&gp( ge7rxuPo+xg h cJCɃh$[VQZPŢ,ą0+,y{>c[nY製Hٲ<|ז/~`3bϱCSb(w@+bV*Vr R9%4֓"{T OMӵ| \Pk0Q/u^ɀuq۹jt)*WHV1QDyc*D噔1')ӵ\aOv^l 4vy}.n -0hR ͖7 W]c4e焒C:g[ +D7`qe;ܼ=Htp6\ˏF?c}G1C1|򍲼z2w~[[ ל"(EGIz6W>> gR( ntV?SFBTB2-?QՏXN(T+!Z̊!q_o9 K1NAqLzm9y)NMSSV4oLqޓ_^ ~yJQ&*gb! 2Jxf <!xbRt$`'#{t.ss}U&V){ ~ct\d5P=NkWZ}kP-_c8]NJѡ#6#Ōpĉ&r?ez'2E>hx44cЋ):9R1D 6>I7مm!C: $y8*s2  6Mb Rvߘ)Kq42mRR]m!ҾX8fޏku~0Q& rP|.;WE `tnIJ_fY%6^F_NxAR娕DaŪ'-sѬQ?[0, FwVz?[+Hxh/V1AVN!<LNV } f(-) nj2CPʱW{s[c}ߐýq|$R@1`P D{H5RA5R9ԈЩ>RGeGybO][neX#B`D>"_(Pg)1~D/}ڎm=}3b0MF8iN9~bpk jUL`({:apz_Uƨ)$Xp,-_Z5wfkٺtދ)W3BB<Yz֮7e+H=!.u+" Dȫxc[n{MQ#q5-Q>Fnɽ ❤+Nj"4M n6Șv1Y\`׶Vdi化X8fu͌qx>rna]ޣ~$1j ^2WHw muؠoBWH1=DЩn&Xe]YҷeRW'7qB&&y~GV ꮿ3,u~&G_Z/U"y@)=T%b'F|9ZD*V@⁾ܹgGH goF^fffRNV1TzԸ\適:OrB|pOC E|a #{8gW e>w)!z!6=^<\KE9 ;6;`H<7<HtoJsf|L[pA`Ŧ;liK"woƽBlL!wn)`* .޵:=GC9;$T7kҊ$x\c]ӔS9Qz©L q;l &uaJSwtXBOAv+ S@iHYJȝO+`nW4!QVKum]hf4 u_^IjZN jA_*r *LזZ%-ՍSo;䟕HK?-1ē#G-4<p)Ff,\?ek\2kg.]Ik׾5l, ii k#~R)~4ez=s^Ͳn=&{zݧz2K~8ҕP!X~-zF H1ַ/兞 ^m˘m0wEז]*kQ![4c\ ~Jj/wW2IR\?ʤ`l VA|2B ~>Q52/\lS}$~vJ<-_l|T^uVm2Vcz2볜ANCnbMm@Hk>YDEuitL$mp5NňJ gaL+$7AܞIR`9 ?ZnD`6cSNmD2UC8µeJ6H"dXm"*Ġt2ӌz;s ;/T:16y!vc|1 h0n}KnO{.[v }#WHL`*U5F*E{\2ү: [VN˾ BN$S1ԋ˩4{9rU֍m :p3&7 '\9+bWHAu79%8 /QByr9+ܛh}jAsWbgHVzdFt{Z}}k,W%pPs$6 F~k|jĤ=]*r~}SVxP0ǀQ, GĜ'uD&&s&k2W*-{6}ʟ ul\V_)½uv2B ~n}8?p3joNBDՏ*i:H]XЖPBEnc-Um$LvbtYþ&˱AGE[ebB'cC'߅>>2܈>BvΓ_Z]Wc0WǼ N}>=Gc`[B@]S-s_ffeUj3!`ēIV sJMׂޖKb5Ԛkx2s|<14 8.e0Ks4&Ugݱ' Oxk-mf-W4QP4½NSw R yѓN!lLӋ3-8bPj_̪f9]Ǡ15`}B=vvj".9ԽT/!/o=ٻ z{+WLjt2=(ݟ ^m4FrHwL|*ɺ%Au@6Ϝߏ \D 1;su5rn)ntӞ)NxSV 9)̷N kNP!maҔA*DǬ^*slh忩qjBcxˀ Ĉ1S'CCMF!jP2/#zlmV+gt m '!~ 1 ²HHd5606O >K|3DrM7@tqn㤖9vcq㌑LOS6G@$1/г-jp6frPMeZ1HLPft1;>ixTKoj!^FyPYvΉ-52E?d{l52,0k] ^=kؖ/2Qڣ+_9-'wړܺig0O1R;>kR;rR$ݶX*ɜ;OW][ntIa'H3Ҍf$01K2 ax#TZV}B* S_9̩P /×TkA,Jg'kl҉M߮-,?t{wj䍐z3>.k^'d$llWDiE4a$8XèbB3jSp} 38r(?>宍^^֠w:(]fR dS_dS//{` pa~>  fjڎ{W]kޭ8O4/G?=$&p+|fƃjvl.c+@kg{_ Z6 J`; k'Vң`TXYC$ 0U6^<:*m}nrprozM(~h^DK rַe= wVWgڭǛ'RB;1>l1I;##W:5)m`ˢXU\[l+7&yC"#԰6ݯݏaߖbwVnzY-u}Γvu yx!;RhDbF=eFv2D@Mgč.GJP0 vNpX )MUr=i[?E7L`Lqv.죺,91{j~@VD%J0ZLlGCiQץv<5wHQdDY=S2-_W{g)O[nM}}7ՄgjW^m!ݞ8qV宽NbkW]"Kdt\tX]_*s.ZV)[.@~jf23k`\|1ozFS;=Bx,6w4+?ymFkyE?-v1b2Dr~{ q/066=eH]R=:-'YhtꬻM~S,3L+$4`,~zyk%)ߺ4m,ڣ+3ALA瘙N= l1jKBI4 Y&GەBn- :L,S <3X4MJUg ~`6ٸ.X?mٻݟ#!E(03 G@фjjR^6G? tmZptpjchct|G@/B0kD0!q"4(Җ슟&xWזY2(%P b0BB1۳~uՏ)/Ě)dŐGC 飑y㓑ޣ6ىL ȚȪ H{ Uٟj6rZ|o1pjp֪I|[?w Ս_ G._G&o|MK {ﲧ0a c72:ݥ HlD%jqm|0 mrЭ%V6w 5Б+ѯXUc U/BxP&$JA85a/bYPHu>$,M5fjRվ-_KmS,n3㟦 ^-;uAd=>nl!@+g #rW&ȱ- gLVj)*i.4m?r9մTSgi "KSp@B?]GӞg~Fi| 6{|Wy:P$X:?#!_k% D*|҇e&)t*1}"' b0V[!m<i\P2] Ig&K@LI|6!m+xy0 /.@pAp` ܅P]{v QŞWېnRN{ڢ{qS廖wo7EB*b;Pb{Ջ0FF-yd*oS gR\ ɽ6 *zOǾ&پ-sG0eB!eȔ@„>Y%5peЯ=jhRwfЛLq_vl$h1@ljq ns#@9,$@鰶b/00{[{4\{Ra?%*aXN*ǹf%{vքmuVXP <3=rH]C9J%tKOfI5,FK""9"ϖy;q\-chMURaPl4E&^|ӬVn' h-WʒU&Vxf7t 砐*)p4Ayχ ^vP9sݭ}kiiJ:4=+YyؑRU\G("%aF?y n4}vKs78][?;}/dAigّ~V g˓Wem6Ȃudf;zVgU 3y~ 4jo%_Q =8?)ALF_ @טטщ!~}U'Q'Y'R'], o=_*=gfVzg.'MMPCbZ9կZGbsߠzo&Ɯ!FWzѴ*iזϢ]6zVp$݊eaZ1YlNٞPb%+ sc0?cMǒkx-ⵀpque^ESmZ ݬ2٨D{2_tZ;:-F5e=eV],RHJNA֋ޯcLڥNiQRO FIdoCQDZRơBU5im0JZm`ʭ8e4Jw +saX)TUIX z1Xeb"'pm\}SN6b%H۲w8P$e1{L)_c/ ~ p؃-G@a^i~Y_J\+ƾ5+X0v\E Da;b/nhM_+Xxf_ ,Tܯ /릏dٷq0t\yq~[ ED8̼\ЃE[@QNf:e&+$nOMיeEZ2'<(xLRAk!>!mir-{V Q3@j"R<.J _j+=Ȟ}h.7 ww6˲$g.! 31Le&5 *}bȗnTM]͖c2Jxf < yPv%Ldc*Qtn~O{%m,Xɽ][?;u yb12療0& ~vmٻ_5V ZH]p (z$2d+W;՛*!/Cv,v`i238eek}Q, T_E {3%O.0PvHP੸ 73)02Z*GHqVXl`q g`~~$j;@-%D ~44 Ώ!Cn37h  D9;Eqߖl>JX$(s!DT2} Z2  9ġlj5j![fM{kERӦ9M-7/ei*=g?w22}@%r)!$LҒ(XŢޏEW_̞[VSMXK n, 2[ebB'x.!!} R][xsO CPNXfk-ኌiUy+KP4”GCېIVrf]TjF^ o,%)q&ՐXYI6۔(vbt=${r%Iv Se_nAv>xGaDЉdʕźƢƶ ~mL"d%Z22ʧ|tm?BXQ;)2O%c(~+S_y(&y?jPftz` h,Wֱ[qe ( 7ejA7Z CsU#[8/r_0faC2@!)7WĜl܄iGpnV_4&AjPZ"ae_KXrgfLk;ijl:ɝ_]m8ԙ#pͶ,mJ6n)W{>xϴo?kUؖogyD<٩F6!݄xڲwk{whBLYH +ةϛҶswmh$, ҞR }זϭv;Գ8H~-*ovzV7x Ri"/g3HC""﬋[(YMZm?b5nf^79[ʵekwJE,?Gc9Pg'j0ұ-[whMd>2e=9,BOWax=ZA9A3"SĈĈhIhYn8gh4sJNr}skHT`5ڲwkF[*m-xѵeko15ޞg~0"I\Hj.Ms+A*2qD$.!Ȁ1Ixc%u1WStn:umI7 $q54dhdT%ʲQZ(Pb"!X{vsiU^kp~]a.pٖ^_M+/3uk&FY2T8 &頯mb_ cN!YNA2?|F?סC ((uI^vs%wmٻY2֧,Yl5e^ri9DmV} k2xfh$l?H]6'+1auט| " 󻺶 ~wvLz. ٽw᳥vO/ApDI %F!cNgo8Ot$&:`KQMjD{WvGVXP <3a1P \uB=i&gז@̱r,aBDRR%=M K.Ry k[V5Ļ0xw2rG92ro1#WK ˣ3e+c 2kI^tS=e^uW'B騸 eM&R@Bb%zΧp&2 ϣL2 Eut][v/,܆sLtrɤ;yn*%NgS^2PL mHEQ4`usNˑoVQ^/ˤ{u|ZZ::o0][?g?zh #-fEy38L Sܚ$t>/ů7U&Vxfͅ1oۿs+8ؔoJ EFx$0""HClTDOJ4f4Lw6 %1^B$ePwc=kD̐| Ī4'9n, s<{4Ni/^ WG5dhmz,.gwXƮG=ho^k˔_P2WW\AlmնޫdC-}o*og~\W2]Ģ'F25+)|+;m[̪Ƕ ~]w4>XRxcBk]G a{@ƳT+b qƦD=|Z8e+XT K%\X],[&gA'$@vfޕ@iI9Of$~$U(x>Q/DpAF]%Ϟ=08BֈTH5I ~18=[YVg{=Х1m ;eb"}'p/J'b זn$ y/Ro[I2+|+Dk˔@qpV9+l sm15-()U%+b)|- \V 92e?qnYcQP@KH.c %1H"?>=NBRF2[= gm|dX`u  ݁Mw`"",mc/ |)1H3Tm +t_xYja5uo[ϷekVB9ւPU"yuBZ][?yaL n#4+$䨝A}`Yq`p{G47J=2! 64[K+N;4mpFH 3&+%R~ %PeF8}~ 22尦Fa簙PU&V){ ~>*AUL~.Dk͇D2d'N Ik2ڥHe&&@DP(@Ń?AGtؔfVqjA:-_T[\qWmGN1\+f_ BS伕% p%*_L);&9?;˶f-ܕ#. ҵD|GLb'tt9ZӮ-{6'2'v~<==Mچ,1*.㤕j2(YW (Ⴚ[^1y> S-ڷڗ{=}ume v(izͧ9huD@GNW;LCjAuSP6]fXzO/kqNvA$2AF.qF.Vݖt'Rl196nR03$)NRG]II0޴*$EYQrugge\ cn2G mXM !Ca џm 0 4;rG> 23ʜVSH>wQw)W3TMVe,E蟦 ^'AKժ.כnuy2=,W|x~fլ5eѼ.R+?w\ZaI݁gsm=-2w-N>8ulPUJ6.g嗂:{Jx9O;m~. O>*y̴BD~]nI> BBoĸ`?'4YOIXG#WFs/syU&VnytBƠ|B V?h;Lt01w4Uл2SRqPeA^ ۸}#M>}\OTAFpj@-%aVF4FDCFdFeHF&O"ZL8<{ϢyhFBO fr ')MN/o_iGVtFCS&O}T"T $Eh0"W}T6Mυ+C: E2kƬcФAy> \Qm& U,3.;?rsϤ Bsh3-> kW]BSb] r"A"Bd)y@_za΃B=z-0V*L4qKM{MmcVF{Α'>MvM,L5AdKLvN_Js)Z4w`y}{ߴ<f8NeIJ(:_^m=PYGrL7ty JNAElح-<Ȼ fb+}%rhfirs&Kk mܼ_mu6)d߭n9$ m|L 3AC֌ƺC2γ\%xbD#YMcϺ&pro,Q%CD }:&VJ>ĭ/MeY E?E+VZ8=W8>crgN9 u$c}U񄾁믔QYUum9fP-іl-SqOS#a);N^{9̌tJB"S#MBiS,`3jGާP ~jj9, ^֓l& (]@Oז52 lo M'}(Bh$$]OAVz4XfgBTAa _.,Rc栓7Dt~eg7pRDjNvY 10̜9pDȝߏ|E@*{O1E<> + 6=˒xx2Ѻx9$gBl \(? DzOAOC!2^ L*4yZ["c[c⎱+$C>c9>SbWw//%a?.nnIG hx {??>/( H%dӏ6DŽBodB@]@7nHn{Ol;"h|ێg佻@y?T~yɵA{}}a[ז-Q^Vή0kͿ>sdQę|>-#a̷Hdd -3L+$ Y]FV ⮲k[hNRTгgn6U&V){ ~g¹dcBAc0J8fʣ?D6SIczǶL=_r%y9JI3VB50vR2x}u,MMKw*mrnt.C@(LZYU&V)yV Ґj¹L%ddi澳uw1tNF2vgHhYz9Փp&%YI@2xs 6b%ny52=XqΎh*l[{lgomHp.+ uYJ' ykk>c i1!g/g-X pF?Y=( t+@ hMhnM=`k;*4՜V1)G,[|+ fd4(-;':ssyu3nߴѨp)rW(;cf%bi]}Pͯ0U&VxfsýK=,*ݭN&$ nZl*zOo|Xϩ}m)W*67~#?x^cwl|-f\kWfǴ~qA Ea% Q_ mCt8: nH~SPܶ?wiGŘ FWM~վ9ߗIc>#ަ(Ax˷CH{oWTLCڶ|2O =}umBȫ,JmaD=cLǶc<>: YTqz81H!0T n*OEizNOi.@؇,3L+$T-~锜l[/_9ߖ]8Q[$&)𼞇۵ekꕒqJ 0a&,zŭi|dp5ƌMݬZ}y>2:/ׂ7]f#`TS7[Te\ cnI$*\9UD!ЖOM9Wz=^5lrŸ`FA \C77%\W](:$ǁE$'|휾o'Rߥ˄!]H2Fs7⣅F'&9hv ~JD1[WDǺeoS>ԏcuNۋP[aj3Wm _q>=vXזG'>G΂Sgc ٩5~~8 XzOύu[U'c%?fBuw^*EoG k)y 0ȋjhiU|/ѷ7;]/_p6R6= D@D;Ry1*84e..YAg@1jc[n(‰ }۾H@DDa`lka]!ghGN$;U8Oy- NuZ1-_cD0D@įxZ0u-3&h4m6)X'[WE(_m"IPc X xȖ%G:AB󼺶 ~`3^o)mkvhΫ]mjgWx3͞c?mrĀB~Nмɧ<ǝaF>yޛ8XK[Bo0[wys~Ev}Y :ѱ-7}NnC[ga̳n c+ۥSvX8f 5aFo2^΅R95cY$moT5(;c7N%!dHTr\񔑢굄g@&&cBf-׬8djb+U -%#` _hk;m6etng]e&)tpR%d?p~[Kp\}^7 w2=c3:!G<_|N;Nh:9O `mk@ΟrsG77 ~ς9# ~D(JL_MKŤg][fu f2W톮!ny[ZӓDvǯ~>#]kvĨ7f>p 'QI:2*͢B{ 'Că_=XMʭ5fSrr q^|(: &nRM&$ŵWrlkWSPd*HNM˽o㩅@S *pjX=ֳi[? 0~ ӖY횶*h=esr\IjK_dH`ѐFyeӺZ#] JY U&V)yO4P4gz횲3!5.ɼ1]\e:8ZזƧk !/EĂd/WHAqFpVt鲁<t;u ) LZ0fLZ0@ [ebB'3fy~\.f8)S4LMR9\bTF1u㘺@_:.r8/SQl>A/haXPHZ˅̀z߿Δ_5@@qe z.c?-3W \!1?BGr2⏛ʟmxe12P;fpç6Cbu}kf)2/Y>!k1,37%jc7t#ޯ2p/J^|2/p5CDB<nRoTH9Gws>;JOt ςй]EÚqmڎO$T:Kb#KDˠIfxNʾ ;J#=J':vϐ*rʼZ-w/m* e ]!g?A Pl  7[!HTFß30G^ڟh "lPyO޼ A\Sj̔ljĥR@@Yt##\nWIJO [fbBWHOx02ne۽s&тU&VxfSi7^MKؽjڶn=/noI4epRHp躲-cYޖK5{f?Йdo7nƔW6Lźes.-"9mR[:a .S&l՟Gf4L˯ K  ĉP> N)"~zQ2 KΓtG>Og`אr21Jeʾ.MORLi!>_P~-uL7xz ΎY/vRJO25QECBAO=$TК3>HtTl*{FgF^!qojP|{0N0n]DWmK)7yD[2gX>wh=--Ro'}MZʚ)z2?PTg|V߼Nl2JxfA301#//~"55-[=MXS8ֹWOR֢w-;L,S <3{'./USE~*=g?w==^a/I^H* S.\nb0$-S`JFSInS~h ~%2P;fp <XdTa|:B9NEocY NEx|VɩN_x=шF~̎? / QJ V zOLu/VMg`Ӛ(/eWl2IemTh"?k.=[ybOr -i4e"t;sw#>@pLyM/$fpHT4gw^"9ڻBļrE*;Wo|.@k iHkf2DOHޑ17_27n}Pw 9_~Y'xqY(! Egl3#^ ni$/xJbH |nn?+z*R-_:v*9fk>=ZFKA-ziב$&Yɛ"n[eb=gq@ BA=6[ZA=5.QQ#dBLg<6}pbӿ<$F90[GZG TDέ1-&~G;exlFgV"Ҋ\+pZ$~(/2 K}xU 3S!Qv`䨑 qYlxVvn@Ǣ g!?U\FHc,ʻ=1ɖ"wv7C[;uNYsy߮λPԵCQ2B ~`ˍJt@o?h8'BQ͓=j2f6rCA"3d!pZ@M ҩ86 B~ٮ}.Ý9-A& ٷ}=MD}X>׼zL,S <3p~&wTSJUz:E|CLP4^{?ie4+$LkƗeXT/ Ɨn\duڠ_!1t^~zݦpE _q{ȳ[4hvy;߫&[oud|ʭ+235 ݬ&lɾjAy?׊uoU 3aN3B!$uiP8vn%`am-$U&V){ ~j3YME_E$Y}s L52}Zeb=gC>^2k*QkҡQ%z]ɠ_ d"r +r@"}Ӻ@R=V%;]8zߖY]ft.Mwt۳ϱγKJX!cV*p|p?=+D3@cEuDJo#6D!ۊCÑ)gww9r >R€%`0h"'pLbƂ!9^G ;NJ2bBd+hQ+ @R N|t?q|-fIA.gWѺ/Ē" <9 +aJBv#)FM]EK&W\t c' D$l U;Os/EUMߑg]eDܕ:L,{ AkY|>=`X~";d[βsCJߖ,AGa"X EJ(P!Ud1}u9sMD6K(.+߼>kd}ɀo؞ ~D)B?^T'o3q ?3rZɶRh| җ,SS?I*{ ~n]Ϻش2?k|`9xJ|n-BnEՑQ;e69U&Vxf_gBl~í/`9?FwʢPx@DJ5w@)pU%GɎPjei&3V\K+n r)0E9ڬkW6pv^g}5}6(Q-c[FBm/"֑:UX0J_-~5q )de%iL8?7%;m${Bu#2'Td6V$;7y@]ӔSkc7tovzطt\[?Q)Қ$B+#IJ2NxEF[چ ~~cז)/ #?k=kޭy9ĸ 9r ӹ>xӔRh%khG}7rO_L -rmٻëZtҭ][ /s*f_-ٶjv[ ӿ_/YZu>,V]&vn;'-Yz+Z'Z-_$AVlzGy) )qA[Y'jF&Ss}fmזmN)_q+1T̳Ez{*ѐi]m1$@±o;&m.M<ԵesQ)VnnkѱMl=2B ~V΅V?z3>61_*E:O | @!V0&\[17yDPx&C!aJ%y y]w>;maw~V>o꽒$-r58db,a:[*2[!xlzyrΐa +Vז|Qk0֠ƀ' >?& ]*@GA[B'Lv>qH3LìXɳ0q8L[eҧ)s|P][g=n\gD5ZS&UR٦L-=?nnےoɻV-VMe C'NnsSՉvV/dޣ,mo8'Mp£ulŀ $;# Yz]2S, &3 "{MP(.ty4,-c"9 HU"VW < j->G1XBi)=c@T^[ޣh61.#uQU$X8+alV|i"Lĸ:7W'S)%E˫Mjbr"`\ǵh)m}p-_`bȮf+k8ݵkiz_J+>?-{eWC-˨̅ -ʗ}t>ַEdj(Fd϶@~ntBz\M3i}cT:e"W0_bAŸHT_bv^E,ߖy)iJWnhjڒw(pgAԩԜUז/PͰer|>g]b˽ݯ@Zk[sWa繣pwX^+\O0"pnV>)|E(7,`1䤾Eؿe"W x&ޱ;އbW˪2ȳBgQ(NB4,퇧s$P+7%oRkh3_75moY4]g/;,ؽ?{[`QnXKME2ؠu?I<H * pg \Z˄< eN?ί8V >7-_,XD][z%:UK_ߖ%+}ߖq6K@l ħ)%.GR6 X?J%y-_WJoEM]pF* vs5?01/AqJJ $O2#Fy-)fY˦=~(q>ᆵ(iC@6 I=X g_s 幞=W`7z+;ZΙO\< U\ЭL\.EF1cJgZr/d䝛YD*w酵;e?{*mi|W27S=(LOGOS/)(t@$ OZ1 %fkUҿm9;fu]>a’6YǧdX&phX8$zLDz#1YGxN֌7?[(̶]]S3B!gFfUyR 癠wKc.%lQ.w3KӔv! < 9'՚X}^!ZH<6*f!jco!+$n͢۱uKNm4@U5)ae2gTj ӳLj*FN 7.7/QDjp>-!&J&8d ӉU!isSXy-j9Em{"Zwy0seI( :}[?7WiĸzyU!k4@ -hu&1LI㝒C. /̓,rM7B^[Ш*0}wNS4[z k*GlPk/Z ˓5di)SiR0D-ZI:Z۸շ%!3*7s}gգ5DB}RXUT=(K*=M [ ޣ:AbA aAJD&چ[\jF_4 2.LdT.,mѴ](זϟD! Jv>6ީN&z r~6+"A" SZ cB cKI׵&d~k{&ʴg@*xlM HR6c6ud" Sʰ~~3 p0{=# c\Fs:Ut{a_UYT זχ =׽.Um H¿I3y&M}ux~䧫ැT^b^u.:?-w iJT/0fj g |eVbA `&N2o21H4 ^-qyLN?K%?5}>P^wDE$լGGzb~>ʣ g#S.C_<`#&~1 bV/@Q(@?9d(FݼB[kuj8|RriŶ}u 4dB1Sʹ!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ז GyɢvIʆă0)2D.fC0/),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*HFn)ʨoAj#\Yeߖ[6 (QA&h_s]5NGCW;d+P]c";g)n#sGY)}Hj0fu 2fJU6,9xU{3FVCIgB|][ܗ˜JZkK׮>.%<)W)Mi/LhѴxګ@凞o{Iܗ:z5gh`IjGoF5.ƽ-XƮpg??Ls"ڒw\ȒBZ!o[d,bזvE}|AxWko켕2Gڵ% v8%HtSJފR{kQgmv7VqкVdJfnF*L&EΤcC8=V5X'K_JWiq-kkK~O)>?Fun^)WioZ{?ק-_&<$cO'e׶欆*+kKW?dU9,Ŕ޵%{y(SYOU"VW <:,&b7wTLfˡR Ǭ\GB>A8g*&'D{Z:o40(Æs#6| 50u _H:c0u*Ci.ÉZpVpܥJFdڒw?łB},o pF)حmVCms^2bm r׾mזVVb&Wվ~Z\@VB]n"Q~c9Ȥx?Ė&$?4YAdWV e3LhxcܕC}r07[޴saJ*S D_P7H 3!B̮;7M[nk,< }ξ)7EhKpoJ)L*"rsr) Kז4rIȋ_w@=`9y6œ sx8h}'臇l@= l\FIIH^x>T+JBx'D#FZkD2{X2S~ƌەBfEK,BW3_?Q5Eb&NIyd 0SƐWx규PoKCu۞eC6`d8eߖ}<< I{OQi>Y3}T?.rN:S_g2*qn@[0hmϧCt~ߏ8E]S3EHma{V^!V pהI{YX+eBX}43Lhxcld~Vsז]%iOQoU R #>Ez1(dr@ﴀ}inh_c KU2`Kٵ%{?,մ%{BM. i !Wti*_93 Rf~O͟0Ƙ!O +^εR;~4\g4i jH8QJx&?iJUa 5۾u2Dm[VleCE1K|w"ޯ_.u%h !=֬Bd_յpM'trDFwpņ䬈oVk^<°dAԵ%}mSt/'ص%۷OcEqR)u[ F-_3q&yVs)K+CP͠4I2>Q,&: 3{xitVY3Qcdk+\mu2y5U6 PӖNR?,~P +(Vg#"/ rٽ m< c_1l, 䡃%ѷީtWcݾO[5TBŐnp[cז.z`3,rq/WHr_ڵmu X e-b6.W$9DY/J* cv +1?lڒbYj5Yl,Zx^J'j-y: {>YYks"C9Y1|W{i qbaztZb9 *+ չfvձJ2fKd̖/lJ3ٗ}9.^kK''&\Tv&Ú/2=XbsZlF?:bаV*o%~.p,xFW;&pSQk>Oۨ ߫2u&eMQɂ*Xx&L|ȁ SdE(U͝|Ͱbu:!M f'RDC=[k]ꭰ`meOI8k&񖍝 :,PqH/缆F]/pLh:X լXַ~ww~J%2xaWJZ5r+NCeɾ)(G鸄ݨ;Q}:w. ީq]={0qU3I 3!/TcJyәnӖ޽P?:u+nsM[z}R̚-_{asqJF8W"5ӑjyDrP(tU^BRZJ`}s^?0i& U!t)Ȩb*H/Ӡ[t3]Bwa=1p_WZp?MC52̭<9OG?$:>3b9`JEJѵ%S+|U07,+9UC24%ZaL9pmzԵ%V^-!dBsgaXn7} L5yݰ%epF14PZPP"FX\ŒBvCLY-w Q~X 3υO6uX^_zU|;M}a)CzU~ϔ*+ɻ7A +h]*m?}>][::vx`fЉ횻[L_:$(kmɐ, qɻ_{cնmPRX/,E>~y.UZߗsX%buz3_s#jLM[%bݺ=*b\d8? `a_a>c  K96=E'c0NagtaY$|!/F]/pLzz湱4i{a:Q.Iޠa@Qf[&b syɹ\,x80:||w 4mJ'7U}~ɗsYeTAfQ"FW I C [/#9~5!KYünTG:-NE߼!P2 Qb 4zHFSJVG\ClȓУ='\W9 `Gs3ķ%}m9 ͯdJ][?:0qQMli2 -_qaȑЦ,iJFGI!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 ج=fBD Z*:X6àjUʦLqtyg z!ᤍ{?9)o9{{+)2t1 ZӚY{ Y%buE:1y7#yD!_s&oRJ+T*U"VW <eU'b51Bs^ ~jZ.h8vմ%u H>3ۺV#ז(a(Y ~`g!vtlӃb#6fdec+P1o%/Wvqm$ʻf*D۾}-+iRAg}[<@Mtbn:tG߰H 1H7},2} E٦.)#N|6ip׀ꓬEbpȱecd's@#Jz>`X~Pg̳׮4u= kKڷ:qm p`<,HR(c=}94#YiC-"x ұ3RRfd]-cG&9 0 aWvYmf̏*+ >`y3>ZD ` "#_*p?a $n'9W~*P8RE cTX3GstKt~n&/r!-(58%+_;i\Y=}_=aUDVjE4i_TI[- gR՟(8:Qb~V)濍6DjUjq3վ|NL=Ws<@}Dp‘\sWĪ,ƉEU IŊuZB.襲mK@dq~mW)ÿs~˰d ]\oU0W9\iJUa/#BZV@j!NxR!z0g]F>^pW+wnCy S>μusEZa24SǟQrTYߖ+n?2e H1v@*Ɓ싖{+n_r@_w/˸kKoR ){r4nӹJM=L{x=wzԔ>{ iWDڇL\B@?Mgcm~!#4w1[m䑛}H hEvײjnΔ8JlU:֓Z̹֢YaB+U^L΅K36/KT͆聝 p (^L$^la2>o8K>p+h䓭2<ǜ9XQH˪Kȃ3Wߖ/[ͺ-HЬ=9xskWfTٴ~]}-HTڦ|OOߩF#D'#풜Ѵ)H$h0oEyO,x)G3Z)}^GXт{a>dqu&L\T[<a@?@R:Pt+^=Z }\BG_ќRbZ("~AwXf!"% lLhΦC@'*겣1oRq%٦doM((*=!51!)Q KX<a, %;0NoPԼ>=(ΏbZF92@D5-+^{ͬ"X$U5lp@h rFߖ[6|D/D׮! g- ][n6_V}'_Dgؔ{ff2+i޸y ˯h3oB;r q@AټŤgW-Ť9N";{_W -_%8ҋJpNۀ)4au$g#Cӫ΂e x&`*}d$J5K C6兮9pߖ[5 !ZJ.9zrGuTJ| 7m @ kE ջkKWc_ )ܶ]շV\ u²zg omty#"7)\ ~m[LѨ {07ej.v–wt~ߓ*,{#k=<Ǐ mM1-S=—XU=˻̀VK00{ aȻxJxfTAAx/Na93WՇ4iKWMI C̊đ4-M[?7-:WgYcј5K.εL ]~sQ5ԮvYʁ9W8DB_[y7iȊ f, \8 ԳXU`T=y_9%lז^xTދr/MQ#`G@'HbtJ! OmfwMޥ$\[jMbrOSr>pyך3 Ӗ/ρQ(61QזsVA"1JHxa`GqE :'?t<ҝX̼]ą1D/͌j0o!z$ȃC>{9][6UL_;C Α'ϱ>PYw*ZZ sb**p]GgͤN6XyK1NS0CF]/pLj08e(XS~*;l?Gňjی:r|GzƵ%ȿbX#U)ry~8O)I 谬{:gD+'ז5fҬvf x`@aVĦ`{r?㶟ߗ~Ne tXÚOCNCɧtOܱӋbkKW/K ,NfN t9?8uV#H #6$йqϠrյI`sz_/|fww8ۦ^zYf߹BFnϹkKޭ$ipi}ֳ4%F=AP6[ Lڜ\xГ S Sğ\&ޔhs~ϓȲSCȓ8Gߴ%{I Fߺ DIΐfT"38-[|X|̛~v *Ü5\lϾgr)W^U% V55#85 E_dSgT\y?5owݾiѼ/*\ykS&bxE1cAU /<|kNȑg|Mqs"F)D-_wb'_۶- hm[5稖涞lv->-\: \w\h,F Lkb!Ogj*25ZLw<mgАBJ;rD:J8đs}юEP8&ps{Tҷy!:,+ ~aIf};AmZ{9 DlZ7́94%+89 jUԮ `_T) Ye>te n2}`8ΐG8sF{8 <2LJzA*z(B݆󜧯h D<eˤ(C* Oq]˩Uf);dꭈzמϯ0 px) 5j,P3QZyEVmC^\wVX]/LOQqUikKVXc jFe*>-df.B Gn@gWF&-1TG9Dy)}_ocݗɩpbN{W6]/Mo^K>ZGU"V/Lwx%XiU#l%i܏ ԯXT4P 3 fK~,Cr*fqHVmisJ(F`(DAk8DPx& T=ʺ{0*^? +q33I {n %;oăzqB;${rBa+ٵ>#CϞsR3@{`+5}[sCi8<X3.jSd SkC+t <Ӌ %ۋUNNAʣ}Qyޭ?[20W7K _n͍=AFÊ_,>#!C(7&eWm&]{gww%')1IJNB u!OmlkKgDT#w n4)vU3\8-ˆnb? Х\s)EӴJ,'-[Tok_jMZ/*4~1*gǑo%yDm`}_Lܡw;jctQ/oVno=߉>~4^wn e"+\UD*|O<˵uIo:E҆]"bJ͐,Mc6쿯_`{ £-GrՆY]Q5k{H%49Hm4|Y3n! "^,fE#I~i-fTl3%>\bpgBves`0c/cA/J۹7CQ,Vb_(yW,K-UA.XMx+[CD{Zew@ד?It9 o]a, .I#8T:3KEi>4(RreX'.'ɰQ'h-BW3vșPRt~1ޭ$Ӌ iOF3(H \>m{ÿ!{6ۇcjϨ< WPz9&&bJq9۷v(5!GC[ipwm ycRp1f3珞3u)l @46Am )h(3^SPȵ%nmV{H8۵%V2cD DwHk(츞"+$$Ő0A2#\[zsxs=NڦUa5hn6%S7LQW$uD|y͸Wt=EX;c+61yb,m7􅤼Inzʇc̞Tņ@vD)Q}_1sIԦ'=Tu-Q +G_)_"lj{y/T+1wsBUd3Q2F2؏Z#ú6u峇rCi}F yT"~=ɦ\0cNе%JةV?GNaд%wMĢR)=S4N^YeL|`nbRF{N+dr^o1Zh 6ԟgFEөeRirS((ƺ$~y*xV)rr#5,cӡ͘y嚶 09rX 4!/) \!ZZ'2ښ" kIm}j4AIiAAVntPzl֝56U1+ѢU <^:(X>!5C°"LT*pnh%4HNff-vڭ VXzGzL77!RceTķ+ad f0L?w]v`[Tg4zIa COwoͽ1TVwtPG>/@z7_h"qEa]"sO3 /췶umɅ`,.v< d齸=bt^jQN)YtnxEơM33'| _b }q.@@-' $kKA;N[ 9g^uFRVgM@iKWb=(;FM(tYyVj!;ޫޕ0J!#37њM(Uf볆0 oֳp\ϢYC{0a'Չkʠ:A6rP\JPQk}FpDרUyrN\~Uy4vJז/0E)yj-̳ *2z;rՋpSd62YG$+I%6XbjiMYk\ƥ=-SֆMIHƧ-_Q) ok=箞^z˰1t?BYYj802]KzFC.5وsOSBY6]7#'4q+\ޕS*EHg^(澯pQN;%$VXI_{#m;sɮJ* ܹ)MS>VšF=d_Qrm/(Lro7-i\`iq+(Jx&@?+Q̿Y!{4whbX+G}ܟ0@A}GmzxAL^G̡erEJEd';B_% +˛UA#D{It-M2 2W*ޛ]53n/qlB*(X^+\^(5Z""&?avȈ3y9l >7=CP- 2x8Kg+X]AFJbP"{-_ N#y ֑h% Զ.[.I\FbؾG=N5M8)+TR/~2 gn"5guNKZ4m }EL->^ ii+*`1h@H,"sjV'T~'f>զ^扂nCI1/،[z[Dg#~( k1 MiK[iwi:3gt N *M"R;VY&bypg?A"o#]zg[&9Z~u, t[W\"߸/ieI:5A~ ~np"o ->Saxjpj},wnB-82v EF[%buz3{2"PՆ`c@8H!̎×x)CRxJvφ!>QB#R=_-71_-NBU&tF S\ grӽx69~s5Sug-U},ʝn0jhLXq܈ zФYQcFYM[?7@v +wSre QBxi^7@>_e!+0wVºۣ/Xޑn?X@ .e $uϵ1xQD[1}[?kV%mspz+ OعmJx<1gau"P7;1q)VO 8R{`oqu(ίZ` }9"{[׻3Id |;D H8&psjUf~4>Ok.+_{G) oU <մlԟt%qA_eO(/$&ۅ:D"]_Wɔ9l:jHgս8Lkڒwە2F]Jz*٦ӔSGH;:^{kKf,I P2m@Ky+_B#s(dR~g}]Ôj'Gޭ;b$+UbOJGOCDyXC1He bu]*,"EU:{.Cqm Aa`&Q^7x+jx퀝<ϱ+^{ϵ =ObXAY^s- 4E72+r wF=@R>xD- ʁ+AHkX2˘ffDgIVaoB,6.YE/ʒczf$w6ߡ{W7C~#ڴ%c'"ò[| aKYŒʒ9QR|BܳI{EhDA)%@=+eVz2Vl1- @c_rA?k?"@omD6 :骢 , @*lfFӖF)"z8YGaaC0[wQ%C$Lq?=Vno-_:s5ٱ+U~9s_s(Bז=]5Qd!=5m ˰ΘWkUBŶ.Cq_m+ٕӂ;\ 9% "й#l {bA Eb v_j"KwM;ݟ2!!׌fE]{jz0JSϮhhNoa I_+qrO3\D}`(4Pw Ftu;k7R`KD>Tn+'U:iOPTm/Z$R@EaguQjA$e5oeA[kNoĻ'~_kYtzTλ$|G1#;JNx8٩}W:Q1F`# |  v(MKL\IUgܒ"_#״E3|m9o~"t\Yx9mLuS{5XxFW|,QbL%:DdN'8MZem=dMaY*jEb)̵bcZFb\W@Rz^DIz'I&#NT_: ZC*Dt}5nft:O##ԍF}&mD810|,F=Nm$@rߊRm-_}ݚ9V^稝kCgӱdQ?VU;")ؽ?#GEKՕ U sP (KxF!/ ;J\*plKV@7m^HwSH6M`$`w_OF{Vg8 ,SX"$mDN@}3~6.VuKF_kIr-@p\K.lz3@h~`qN=F[Tqcc @+@X} m[gr­LK4/EODj\e hR`BH3Ll]H4 2݋g^g]2m N~uj6_vߛ~f873I?sUuXY(K< RjYbq̌laVDG4HPyns?U#9B#AGlmSdiU bWɋ]ۍ@Ԓ! \7JDAꨄ-U$B|䑎)Wq:!{NSu(gk< "s!őqeD aemsD?Xg3fDJKT-bH'hކ؞U1pݖ" %K#gxvP%XxFV=h~IJrLY(kz;%VF!rk"WXnq$8\ᙗ2=Sb?K$cP ua0+cbE9h,\|+F]\sôXxF{%tϙt-4w(Ͻ/YM1mxy̖#=3)dI\IҚE4 uK)pǃQJq]全'MLUM ̝ϡK1l"Z Ӵ-sӗ]&gUQz[$u\xz)KfܤHqZel/[qԆX#wINڈVJ-T1skd@$J&z Zo W2_fdW2'Z|":kb~G﴾S3൘B]WLN_?;TtIJӇZEb\WL5s]tأ!3_ Es;TTj1Rj-Ӡg)M[iH~jlZHR\(/_Rދid7],|^dQ AB`d!DϗNJ%"6K)76$)\ezZVXW<# hO+}&Kҏs[NH|}逫y& PE|2][IԷO@}z~)apÇ#|cw0|\_ۖ҇ϧ.b$⯎iZ94mg4%[ٗRI}r zޚCٷi*Kb:H삣~\x̳4Md=IEʝSk&z/#y9Ȧ-_:Oy\~DaYrDP4p#0/6GA[2Bp%1iNiNi>NazBy1w)rg֭Zn9Jj+miuN]c*aEuk)@h 7{{lsfZc.мScRI VXW<#9 wD9lʀ6.-f~cQ1aFّ>:\ ,f*rm3GTی(]?gG럅zGşWѵ'z~i9&|v+K%+׺(u[*8}@wjHfxG^=~ ʁySB!CC{]871ʑt]KvضEkp$O|kk)'+T}2LJt+Kg=)諭shjƦ-_˴ iic3#Ԗv @ sB.`hWhWiN ӚGz |䧙 L¥>ѬzO&b˱њ$hm @w:.EjFN""I,5~a!Z7 cՄѷΓ;al)h C9z G"?=f[yaa)x1 @fĦ 0XgjGI ED%;PJa\~y` [5]AF{1[p*V)V8(^m<c{lvYr&&gJPW}HmSړrZzږtu{j"} 6ubB5)< i?Z!9jaXP_ cd4q;tyuF^g&״E3sfWO\J`350xn1kV9 m||5z4VqydhmYVm Z69 2@ ٳ>uOY^Dtg 5EisS1,a>ҕ|m{zuTjZNgC  gq2:A4R&M_/ QrGyy/sr<ꑫs7wnwOmqŨX4ؤgiɹ˒/yYi_RHLB)#&-<.#O۵r>HeU-w(J˚ٮ]Y j[H, <#@(w~GhݣXMV)4;튗~ZFy<2r!l\69d$<"k%|٧sQ N)JS+?Wǚ ZY᪚ 22V-{/L[?.d#Y X$Vʅ籲yJc;Iqp#T,kYu:闶36EvL> L8! >Y]ข7S`oOh)v!FY Z_W-o$xٵ Yp,{:Ϻ]}kӗ,S'?JpBڦ^ը+[arNau+z%CNrtź9"vjy4 >Px+P{jag&3ews)ZQXӟ\NJY Lj3ij9H,}WFqs:PǙ ig{MmbBRwSr_Ti.拏~jZQ`m }0DQ޽5,]-w`wŞ޽p#O X>,3e6+ .@^1A>t[ޑ|W%-+"ϴEK˖+W~ȥUR@{M'~GqB̓m|!w)r0oζEKVnD>q#̛R27#CBkowB"#Թս)ԥVY ],*!:jna .WC.l+(g}ew.$o[nh+ke5:'-rR[m9:bO*ȴNW|OsͭN$Ѥ;E;դ0NVXz dSj4c47 0#KkCڐghw\FFP}E<^Ω {<4fS%M|Jv6EE<4ݑZ"^6I]JNk(JSi5.x 0RSǪH bb0W{?+o%ӟĆl ܕy$HNUap{3o[*u n}M[ $9RA[H =aV6wfQUV_^WRJ)'myzhd"LUפTӑA_Ԍ> hƣժ=9{a:CKb|@$PqYu\#ǸUH)s3&12tp$&Өj]!g%$.2BetZ_D6jI0a1jQ|TOj;6F&ǯR"'y*oF*zS7 [ @̔?^fC/N?㟌EsAPje$ p֭KV :l[PQ CH-JS'jH+rbah033-%.ZX@Q&9Iܚᝫ<mO޶~C}% XE'B\H66y`$/C ʠ6cAʳ2nu.<:Z ;ޫ <#U4=*@kڌeLCmզ;߮~JJC51io)HZEFq{ϯL2}3F)-#!o|.A 7/n<~bܰ/eLz|GHNS36ΎQ6nv4;y:R+OLE l׻Lq~g8:`ޭv%=i;ۇ2|~8}iy0l3DbSOl{6~c]N g 9#*rEG{04@,DصEWyh1V4DE"-֓m"&[IIf{sJ}vo錾1(8ͫj<`Nh ڵe}y|'IdJc"RG>jи,EM}F[Z&GfY0G[ڍq FVEJ_W&21X}D;|Ax,ri"[#!UKM).ɩ&ֺ~)(b DM`/p)Oߋo} `ނ.qq>D,eմHy? 3aBi l&JHtw*!= +f5 ~]uTΨrkG>E_MUA[7KRI,LWwWޭk9nzϽM`b6(<|+`}S,`f\5a)cep]!g?g3\lսiZ%Ҡ%.PwMNr=+зUG8`[$y([#9ϔfYjJsYPH, <#cʒZ{^:ִE8WR/Hμ-n,i껰w!5}^H, <#![ u 24JC}\{bEh"iWÌM2QZ_Ց~vHq:r\VF 4N5yy1$e\P8ږa$OgW8IR!nJ"T 䳪o2B~e@^g?6z]U>jgI㥖T&ݴE{'ݕjn*Vͧig)ӹImX9%?/pMmMA4y,0:W> f$p'vw$~TY`G9MƯ;iAKO㣏Abg*Ru\/- t;A<} \'w3 )T!ڎ-/{&dd`oapt/Zx ࿙ ۃvG<w ?"xD": t"RR"҃T߇|$ɧwqqL9`t1FDF 9,u@r^b YM+PL7+J{wS Mг)i ++SAl{xDU4gI_UV-U!]G *2V[/ϖoa1mj_W)j_J$jM_M[ڢVR*j',`\:~ɢY$wlb>0|MD)je(Ri3b}49?OuD-Z71ڗ]R72D/wrxC2Wykf~gw^ h;W+mj€I'S@ >*H{r~u7bWxaƅB'vDk§(Cu}*q/䗲hnTS /,)5Zm}S#`N >L$™DL~ΚOϞs.{gx qvyeO{Y ZH,uw:}jϊ?-F!'7qo 2'!K3_Gcqz_+ |  s=OT 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`ϮpVƮ_S h 낫Q=]֪(YEb<p֭ϒ't)god,fs-rklDj@q˜tD޽3me7f,hluVw~n~3p1Mco9g@xQ-s|0haB'#,q;--F&" xFgzR` 5O{IL*DͽĊN<3x5t@HJlcɃƔ_J[i%TNZEb\yC%ܸS;i8Ax,y(P[ 5%$'YFu~zA$n Wr9#xpRL=|);){ t/Lz/P+_<#Um2jMߚU]]Gڋ#0VXW<#/ڱ]͗f0r2r9,gkKq׬ˠO¦gkɿNaM&Fcen4>U+(w-} O ġ+%H*nmrL!P5''}^ xfga+' ( 0Cͦ E{%ϫ" 0ȶJM[zݿkN hp8rA6jU +KDׯr{X)MelR[M'n:sJ{AFF@ىĒ7 albt\f%Ng-ӰS" JHS cqN)b!Ւ]V W+kuZ'4m$Qwy.9#%j`lm,?Ȏ+; 8aM'#"w%o?Y&MÑ٬M[:MdeFk6jM[nusMLN۞_N+:@u_ש s&!yFfglՋ.%3z$}^fZ]٨(hr?RˮSS{'m))Мk9k8{bGêyDtS~p %ٜZe$u ZY{"/{DLESL֯u&ls3ESst,-ZӰ +Jh -2܇yZ}*mm"`trCY'F %mUrZG.JsӴE{TۗήFh9/ ĆP9ڈ Ȕl@R}5momO"I/]҄a˭7{걈ռ f.Xdƪ̂k" xFNypҏ5U7 ct!cն0FT"ߞF gauKi{ կP\>ԇYF3–IbjdJ\ZL*w|LDhoSJFmj잍{HX+A롈>ULjf1h\-w qu*Ȉk.*4w]1 U$VxF3oKvL,ȓ Z!?<-mu`kGak6|Dz 3)Q`DU[G#|(Lt\b$EjYoBHix ` RB M}Ef>*G_"{V ui- Y>ZG~ =|]=zOɘ~gCSwh ֒1`œ{hI㽥uߑtNeZ23;8 4q?#drr}|Tzm zTӚr~9B %tv٦-N"x_Z6mE^VSx:5mx( Q +js[vYL>9r͘&f` W r9ތ\^o77?i֭>!lJh\r_xM1ܝZ)K.9AB03Odt+uLzrнmWE=Oq7H%Hj>m+3~u3g+c\y4iWgN$gps't/n>R6g 2miM[nuo+yd"]_!x"a^׌Y 8\RP`}N2KXSʠ@XxFsZ@ʔ}6wѱ%S}`B>3Qf:;0x_NXEb\cM ΁ժ#C-TwN ձEp\W,tpܱzrGﴞW3-=18y/r<{$nm9Dtĸx" xFcޗNg8)EYI$ m>6vM411m&7Cb'q<˜͎-6v۰wA6eOIJf"b!<='őw2\tJAij"OEOQLSܶ|zVjU5g%Rjľ_u+ER݈jb%RUbKdތ*uDD*N v#;r2 +jȷ3R1(a= I@3=S g92cS6q &jQY #1t1[7N!KK D{p7SݨNT$3֫Dɱ< 钂gSn"վzaǢAȿMwPRQ=7Y֎Z)gCM΅|Psi:k( 5+p[؛n͠ \ tf9t66aʻVŗߦ[>5M4_"gwأ&9 !T=~1H5c>*!sjW7{s՚uǰuѺᴗLc-K3ĺ-_oЦO0mѺ٠ L`B@c^(<ɑ^bJa-^'`:_[\ DAw^r%unSHCGiLZSG$^בn6mީ} f5?^0*Y~}mWpq =u.j?Zƽbe?ͨu~ RF]&:^S&&B/7 ZOw $_ʎO\XP9P|4I]Yhq۰VXW<#rlǔKSi6֬ʹ*M[H|gRϻ35p&;G*Y̬;sYGOxmAƺd\{To\̹N`>,}WWn!$@Z)-+P%uM<#c~|̾dhS '`I?'=mؼM< %S=,.X.=/iSH c@F "H A%h#B$j_ r`Xdߺ뎮=buGk8"$:q~T^=G.rٜfVJel2B~f|4A)6qH8|](W"5q ~n-G\r;_{o"lL&$=&}˟mΕpDeD+P]JwBbGߜwKHKt|b<-iEo^Nb=K@.z`DbNPPf3 um4:?\GXp>JAG-"bnlz'ƣnF|~UȇW6m&e_ם0@qmZוּFK{!b*~D{[0 0ٵ#AVu޽{m~M5 rA( ?b`GBhiu~q+C(땫"9H*z!H$EotAG5cG|G4H0?c7H/nr&k-὞Lr?F$D3iYSӞ")xstF۶~J\,SB/W?*Ք!l[t4E'P)Z 'Ȩ5|,]HZrk ʲkY+_WYz@τr?u~v9?/@y?rXF^-*&|MM*# " ¸Hr+^ M9Ș7Ldۇn!G[clQbP(!9L}jT4nƾ_M3kΧJ{ =Ï2,ZEb<p֭]h)]W+Udg_ZEb=g?Gġ %yg:Xxnv-n qj4ԶMӞʑtլ3 (5a>Y@$?a#MtYGo٣Jq* |꭮ ~w:+=~'zӷ?*6ROvմEV҅d9fq1 ϑ(CE[DZRc,9{dG׎5&_vuQR+n6L;=5J@Rp*=::hVj:ve3[j2ڥ(ܴEӟȺu3a⇢ß XT`["SHuɹPoRRXȜF*݄赤4>iM$,I۲Ph(s+^u%r:b̯瞊:7ad3roU:n/B0xÀ\7!nYs|L7~#xrbY=qUx pt<6L^d9IEZi[ٝ&N˙Kc X%frhXeu"mzyrDP"kPؿb3S)։UNBWJ雕nWL̅tUMH$ KMKQ֔xlEsV*طrjRk㍶3D'=սQ^=B\ۖ>H, <#7T~ysmZ?#蚒Ӝ+zHl~\OJtѸ?KU䥎i#)l >l?%)BekbS-iu+F Z_lq{=+ʄN zCF>\h޼:2KZWQՀ[OWg:n3@.; D.eǺ7`f DLdXuJTp`[ 6WB,l nH94QZ}eNQ3" #EY %WҾ 5xH=j;(4O<:}t}9CS(DP> Z2>/OܯZI:zWC <+Y*`iU.]z>+].% [_sYjEy2^K͒kk*>X3H+/5~gGLR|8fB3(Z BX]sVO=vdM1DA0'uX~&Wi&O: }[-rutМkia+"xs~ȺbJ$x/0HPơy4W3M[lykJkiXQ ê#a^=kX4z=~ôEA9\C((|IFre^vPYEj[-rRpvH"4t À[(7>Lz).㬟%[5QJc]d}-hp(cIzT&!sn",1ƓW]N(XhtKNV{H8+::é%0;<ڰ0eB 9L=U/At\ٜ!:r@a#Hд&s|oJ0,SFk#JAT#g恶;0.!DW$t_IJDŪDL[[?y@HĬgX32_nAC=Fԓd~Dxz>{=ۗ7h[]dUm7^o#kG٧5MrġNzY :㢠i fޘ8D~I|]ۈɚ4 yXlwoN r&!D1{_IБ94s-%jxϑe';[>6:C6 |kZ7ǚT ytz)j %{crI?/j-_f+ͤ=m86ɯ`,3&_+M`bzLŸk \×ӖC:zВ8Y7M7# ,y3S5`9k1:qBR$_JGϙR 38XFb\W, 0NyW(K]t/F uQz{k'Y啵]!l[C^oO;~v, `TG?O)@+`FkUv5M[n<1#ݝl0+)33sFi8i?S&*k4u#ql.#s%,{-fTϴ$.~`ē}4l+o++MBuA9k*=gj%UjUsj ?GG`b<P:jWHY I)THdVTGNG%JGt9nj5Itb.Cѻ۲5>Χwz h0Wǥ5TY?"ކ[R=,!J՝|5s4~/ҋcUE\Wk=`Í_\P4< D<ă&!VXswi =F6ctη4ciSc277E^(:$GSGiWkα˴,a=G,hʄp؉uN"x@RNde))2' ?S .%!&v:oREFq(@bl&Gw3꘬f3!81Il:ǽ+gy=D 3܉me/-ƓYv'EBgb'm=Jg+^jHg"ՙ/D(yEn*G-_l5+&&йR~u+ ,61@@c޻ԥ?)9e SƂF$ekxNfkkx̧5]W6$ ʞ`p(ڝӜ=xR&k4>Xy֓#_.Y򔚯ӻ/֣u͞ٶ~ :}ĞP ]g!ЛN'z0K!,2k;^Sڡzoրyoր z"əV L~%d"vKr.p0t*'9i^08G"D.IDZD}Of#O/ozZz-|1nm[x_+#!Xu43"VWzF9(mW{JGI)ng'RR~R# 0 v\Rj+-]}S0.ꃗ{`DP7< ԾU`D&w]o7;F(]z'y>1zek_hVѵ4".륃e`gmo.h(nۗDC6x2_BZDU{IVfEVJ<9sl[n-_/1Z6E'6V5tDQF;u; '1-r5E\vqd#[zXAe*(WE*%?&Eseb8˕K27L JA!Bzɲ׆ZV`l (˖!A>[,yl+?q/2Kpz.{H:KzHtx>)=-# pZ.cIDΩwLI>cy|K*n} g#[C/gWIe}lKSΗWζEfN k:l.l +߼<ݑ~X=0XJM}50rn%$|Y"ƒie/ϠNu.ݳ;蝾dehOKKؑTXEy=0[AOi1G R`! #t3:MF..C:m&dR0na߂dmxf-K`9[9'ZF(Y>Si祼(;c7˸HY 6nNq ,y2ZEb\@\yˤD$S>6 <5Og

    |>W󟆸1X< 89vGsoLu$?ʣLN= *ha,/XfJnHlO#{u%(@=-JdDĪ=V4m^ }PDjdyEb,%b"o7WI= "u:.||m4sfw)X׳Yԗ;%w9"CXKT#dD$MM>'Cy4'!L+jO{zpNq`O-o!ܵD6>*VW2jGmS/{ٗ}55·y łī>nimP+@l킧`"xhS-]2!JVoBwr2KxFLW~)eâ8'f)XlBJƝ| cZI0Jsi~m%G gr~5@hG["',@7z7iP3CXW KΦ!Vgb YCNA"7bqVg厣]xsg^IJ1BWe AV4$qb0BxiQ]oyMݸoZR lx5!c$d;tٵ[1EPU6,`6#dbǂrM&F Ohe08 }+NAlMWΩ[ЎL9>XFZ\fO,)qOlGmiD*}N="(:"?~ }X\a@>닔fpYmHIɆZ^3h|8poּ ] z>4Bs2sٴEK;%{z8 M0PSb~شEjc[mX(ǣ* 9""$`r-G}[z;HِN9QK=iSϔY5e"]ה-_K9?%yMSsk^,sSgq{)~69Άp rWeղ* #skǦPmdJQ⫦-_:sJZi+H?㮿UuNص432KxF3^4,K?#k/֯p4;R&k0'f\{ZVK2"@F` K2 *Lyrv5XsW;e n 4 0,(,qpoo0Px.E3B`q߁n&"9.Ohzwsv!_إ9[ːȎ}/{%23RE>(ذ0έ~_XvR#8>gLЀ|# #1tzN~-Zen*\PNrbqa#n3 @r{lT0|e$Wu t#ѬΗ=u>5b!U$V8Ffn =2X $Lz~ V+e<ּ_ݥپxk8dWPM%4UqLt^rU u`hPԽ8q cd(7B\MH-oWk9gɳd@#R$In,utsط t4gENJ1\!f>+V*˱ZY-}Z|z3c DQL8_s貌$+ih.EGό瑈81'B=C,w~"x e L^VeX[AHWҔ']إ2a>' v>=_b}=)UL Pg9ɝ/ToM[jB ARPş$ʞ^ѣhig-D" }X]x{˜X&A C~ ݩ5i:?0PON(^԰2" .rNED!)>ZܵWyߦh7'> hQ: {5vI- f70x GY^}R~VVCٴE3Sp!&;=A#4]{pI~ݟ%CgRBpb/%TjbV~o)w0igyooKz:wcjF5VXW<#'cW1,XCV[h؞_,9%Z}ӌ"F-ik~}v/?\%{pj4D9 [ڶ.y-}fv'S"tdth1OGϥ098lZ|_a0ì WRo"u״(py+cUHr/`Ɛr7n@q/DFWzym%mKCSdN5.(һEfXP՗~N&X8݇629M%. ۦ9ӞN?0GcG7?dz9@?cQaG`F'Q?N7b4Hny|ػ7JFL1Q'BbU/abø?ӻ?o2ڙ%X< E>1"t1\Pgy粳wz:1Ֆc#?w3_qPHaHC5jV-Z7r '_~%]ԅ+pgt\*m4lc㨣֑\FTDz9zmU5^k$s"VGs-_cļhS5Ƞ@OMN}[^@t 7H8K^n<#%/o_rq8R?<CWbnzzgat=aL[ Y5r.iKx ҩ~jݳVfԝgTY*M[?~fj;Sv3qgD9#HP5߷ErZSjjO}aV!]5m6E|Z/s[}[?!uEЕ\~ 7sP>If)Nü.3vL9۸wE5G2ѻ7eߎqVd`.2 oԵ< cuI]PcR85ӡqGisn/#uKdsG|D|9\Y x`{"xd'|ġT]+?6D/d p<ݽJvbj_E^Kfu8)/qJƯ>:@Z9~Ҩ7pڦ- B~R%e,zH7={:l/KFkydXF.BpE}dLynV+vcq%ỲԾ;(gv}h=eOxj ,7뵋Tyyp57_./(qxX|:ۄ\dc-N|uV ƤEk Gq>XVnuo:хZX}Tt9z֐ R}5@5k>4ӎq(kRI}Y ~dot-)U7~GwIfsD!_-Ɠƿ2Z2_Qlɋdy˄q >V_t4m^'<Y߾K 7SՂ6j:c|Zһo1gN]wU+[c>f˸s:Ro 2U+o2(<-gH[,ذ,)7-~s.໱\.{`4[~(w ⤶2qŒIVց~DžG &^ZW{TQw+GWȄG/v@jݿRc W"x$rMіU>Jn ~Md2ԒPf1 A#޶$' =iuE*PN.? 5Z"iI{Im/ 4'~:ui4tg|nj;8ݑE&hF=L}ˀ -{~%ϞuTAφlk@.3{2mN8*Wx/h-еgH/kretpXVR7;x(?Y]Ѧ#kf;<6SQZgkDcl}ݙgB^ `t3h<W0(|`j͆em" VxFߞ*d*z2-UJ/]2mߕ\xg7 LvQz!5I9>5}RI0V78-Z75P֊O^g9Eٶ~j_չJV^i^F9^=Wfm-?KB%uɗɧXcȴEV{SӶ-1^ S[qME\n+A }~,OO M[ %pkct0:BF/#~kI BőĩX/P(ȌQn¶QqFr] P]`/A*ZLt3%"?SKvR؍{>~g3!1+ +Wyt бGGQMAdu\ *R˨h\$3TRJ&4|c<ׅ&t\b,E\Ze?=#RVx2G^c[1c1Cg ?!ه~_s:m%rno!Uvy 7Ww/;y|\507 ),sHl@_@t]""D^ѧӝ(bH| EN, *l[E=09"1 yȬ[4vPVCd{#D,d4=uqW=SN@`S:(QpceB>2e\Epcyq؂~wQ{=h$R}8%F4%+M[nݦ ӊS`9jc-J#iVuN!5S&sZ `tܳ_"Zzi^Y[dH@1d~:fGT4?Vgq,{GF 1&E{UA0r4oXONָnnw Ьys^ tAV^[4kr嗯gÈufA` yX>_O߁}_P${8NOa1$XTzƮԔ 4Ū;*?[%VI69Qմ}T+ik Kw:w7m}28fk"}Ӵ^5OTX6u"(aMymsfCݷ$ۮ"kw1ZI(pϵzp "6vG! q=s>Fc>OP ~LO]/ ͖HZ&ozR:IH{%`9'ñUF )P.{ UQ0Hhp I~0O[ ͺ@O ,?28Zp'[ χSX#7mYZg{]$,[OTh +v4"n&#B.XPXDFzrDҚ8m̹6RȔ?PEV"7/t<6oK/21W3/W/Й@O']81 !k#lg ˓^,=OY`:6.PvSc$gl"!8Ztk ;[B8~iݠ ~ /r,==*䥸Fs_{ C;0(Y/y{|c=mS%iV۾v#A1DQKGb17atkLZgk˷)0m/)GNĥx[tޚ5"%)d(yZ&EKBI>ZJKRZз[gϝ,$OWZ<ؔ#2d_be],` @y6jߟ='䀐tt =^(0̑>{)xŦw`(V˓^,Cu@ D(0D)?f#*D'BնyKW ~1B9R0Ta̓ݻ{uXuRr,Qc*JivF4m'v`LgGVy++) ebiNY̓]"[uoKӳe,$t~졧.(̦̓]t-bp~B, LWtL]c팺L6{ "WD*<"k"=? WN0qw@+[ 2C+#fy~fXUBOB3eRط hłRA/m~X0sII k%*cEStS[/>=YgJMGO:R?ɎIHjB.2D`F._z SI[*%IǯO1]_uQYCfx!EنKYuL ̹x*hPBsU_y+%UjJDh\Z7XOy$]!Wh &4(MBk>v si ĜPqJ  A t%:%(2O!2ۓe 1šEDxBϺ_U=PAzJp`is2䠆B8l;l}OXz 9$%ܣc ^/:xxD/p!Va-[35\NJ E1֋ۭuQ;G RnUBjUb4F."q/aMrujPzt*PX6_C6E e} R DSp n" \ FpX1u= uRo<ؕ3b ܢPM/ K!%ML{f8^ U*vM j&ѣ$e]yl'<>!o{~ j׺R B.q|I@>|3kq۞2+v^{&=*N-S\o(yMMyR8t_>^kWE]k>#QuNlSobA+(hnvNZRkB*RjaM:TAa<+jH\W:¢7i3UrE Z&_ŕ3=eȩEĕT曶PxxaCo}ԙƼ`Rz|i{zSKv46+QԷR1l~#t@C%D|k٦p";d1FQ򤗓Fw`9)uo x QSx5 x>rRh I U#!2.CT<G H>dsuy&hK%HWyK~µDkA0 {e:(P}ũE>2/QSMWdKH9 CI4!plJx̖aNEdJK䷪r6o~IWtܞQ)$ڰR0NTT3^0Rؔ[K p?AFл2>[3~M"VD֣?)z)bE'ꥐF&m"CjP~O+ g{['OG 1I;k̮$Ԯʸx15+D%߿w!%Ҙe<$v'0Ō!RON1M WPdL1^L%"cn_dt|J<_g>FLGDH2yQ†7f 8Yyk֏_D4 -znI^1֪]Ha\N! )(ZCޛҰ'vlGڞtXzi޴ dRH9\z6vבY\bKAF\Qc+CZ҉%p7i)0 ]ͭO,$D1h0xR`լeM!DUcu!?Ƙˇ`ڼ536Q _f*>;EWc Dᵝ| eZ3{ T+FİM[]ϣv ѝl 8)$w1- O ւ6 ]q#-1Hr;GUx@"4œ|9;N.9 G:c"+{g*-6 kZb@~Q)&=Ӫ\Jtv˯!z',gW` czFm2Қ qq1VUyc;8~4~y <xjsKa=U^m`Wj@$Xܧm_M&~A /װ2(Kpy ļ BVUO#+8UeaZ0 TQ/ i.j>.6(p"i5Q}E;M8|}n "5QQ߉UO'*2 N1jBh|y53 N|;ڤEx9b)t\Yg@85cV+ I]*LZ5 ;ZSChMJkb'"07B!PII$*\X=Xb-=U?)HJL[WC{o7lAaUX@IuIQS"S1}j9DR@T='4z@]K$RF5|`pJgoΦ礝ݡ 46n_ibm/mtQ14y1 6 `JZ`u'-|R>Kߞ)4mOz[UhTA Mͽ 4W_mQ@nр2~%PqJAN#̂`",iwQǬ;93 ~)<'%I8 xf'z X4ހL~ߦ<;Qy8{|>xdP0Mg> h܌Ʈ} voү6J`K@m~x~>*ډ|iMR}% t,YQ̂(ov]4"Zk5!0 x7atCj (`'d;8=YrmV~UnE#?#,MKbI׶إB8J"d3$N)e$S5==7@M J+9/Y 3ti :EBѶy34۱ d!9-a{.Ysr@{: ,=ؕ^-w-̢]8L8FjK݁,/&(dBKLd*HG5 /@ PO\uu0aQtXzk7; Ъ!4J¥r `)AQ27Xu=2@[~`Pao#{Aǜx ֯DV8 z(+8!*1w$ at9"M`bb$"YH,T22cْ{DI1zGdN}~s;Iwq,/?m~KUh^r,=~;IM;2@N%1D1V.qU54 Tn%%شyNNHY.X] ҷc;xL{ T"R(rPݡi%TcmĬB ;%~XX}qB۷~Rmd2b.T (KH!JMsŮ3ϗLlcz_{2M؎ 3i`< r4 @ W~ b8N"ӀA/~8PFgx&YA Ka) |oPPA y@XfУg:0=AVVU1ZUBuMxzCd3/V{/SrȎP 3O-4҆qDhd(m(h.RA{ jgl$xwQ/ֿެ˓^N݁;{p; ֞tN <1eXX/˴6uTdNKv)ԠFHSwD4y6KωGb :'*2cc^g -Gu-FwuUmʯ?TɗdULˆ*׀kiXMH?«7㓩&-tШFl;HAJf+c2>"D2"|jYyۑuGL_=̓]y-KL-Q jz>ѝZ-JnuRWfNM)8S)ƿOU >6v4e7z`{%em`Wz$P Xv,ǴnVҾ>@I<](W H/wj(~Lj<FQ1Om! ")K HG?GEHHj14%dbȟXEn!MfZrN‚ r(`g, ENbUJRDI6q2y^56yz7G!LHvGTmJ-/u|z]2: MHp0Ha-SBu'si9PU~%8003"xSW$$x. @ YB&m\HaLoבqHNJi`f'IN`e9-D9efz.@aY;b 6i[m>;FBU'$kN PSӓN-B%5@S~Y; 4B 7TYd=C#\ۍY1`&%{K*9֙o)\S?\= V2KI{==ض/JMKi~A \;:L/#xd؆XCڮ:eM}\)vCZ¼hiǽ瓡8)a /Ě&Vyt 0g6vy/cyT4U|巧uoX5YUp VT%*Ħ1vM9yV]j󬜼w3ͭD›RuV'>ӺtT1n cox #;`1fg,0E2^Z& R4T DF1T=fNA)]%"|ؽL i-Lc4]\Mꎴ#:9>Ӈ$<3]GАaq2ezEc''u 1s,l[ҫ-G%`dbO͸'^os&z"vIm`6v9BKI%U?赑DYFHpW„Tp|'2m۝\@.+X]Αrn::DؔH6 #Ѕ+ lmT7Ō4!s,53pd,p$\Hx|]2 qzƣ a2 R3Y,dC˩8$cqH!TPIR! 6]HI׷mҴkSH{hXŔ34͙k(־0W̓uY3lc M{>@:SM9,y3=(ƹt8EЉ/!~/|LЙ|S#0#PaRN,beғ^d%Fw`)gϧ3](%LE(г:t;9B/TVS .6; P&R@)qsc09bJATatʸB-ge2+XphJƱi`zg+9XRnY6mȚ>Cʮ`#MeA4W>'{)\/5`SmO/NaՅ;/4m;Cr}%j J 4mv3Ga$*D)1f\9L翟AH Ӻo&AD0D%z@OCDIJ4f18rR,֫)ʏB!b}3lߴy+tDZjsmAX K2ܑJk,c3eo{Y{]ާVy;}ZfV` yQ7%,T4KNo;o+=h*rԝy)!jcS}ֵ>?a'nax.VEZٚtzYrAFpz s%svr'NxNs*u>ߧ0L]ZL;ao C_m=69@6T:F#|;Ƭtj0a0ΖIK6$tc</*ņkyzuY 2L4vu͔, REmzVezcz2YlWCMJV}x>c54"S촖%*)٣`@8=&?c$m;16n.adT->/"*|YԤ1/s8Sm>c1aIY]Jw9?b08HfѴy3mamP*D(y 4_?+a&5ET"Dc1\t"a9h<~MU'}ΧRe{[zW+T+뿬4HucVuQPJh6Ikl g)rfkW)n׿HA4?U՘VKFڭ PZ?ƈdp;[*G~=E 0f ch${9P(sNvƘnVvC !U=MFWߧðPy{bY c;z7La8CD4yCWo,c|TaU4޿ Od%m{u c$OPW~80@DV""0p!rA/QFWc@Ԓ#UB ^stTPcr.@YtL`0n?n}]~*<`6؍BؖZ! L$h) 82 B6O( RҔY<"AU;0]yMB(^{#п(O洼Ѷ561o%rv ^Ǿbӭ+Cb'?Waଢ଼ Ƞ+jY#t4 z: =+T{ {^QW|Um ,H9^jj%zl'UC; ך)VXso7X*tZiz:ͫPF>z~b-6Xr>*y#Wq>, b@zI{` }#kdzyҋK,gEggM`(I/ahtЬTZ^GjV)-IEtƄ(##(D}禭LWD靈[;)r N:=F}j{&u Ӷo F&m|^ޡ6O%t${NEm$4S%nkԒ_@O]6Uxm7WWw52#QNssA]T6vO y~Nc+I ơ !`ln'Xz2óZ,uE1 zy*cQv,B﷢GS k$nw\tĽ Q"K'g (x@1>S Q zggL'O:9el)B";O4pyYD2uS:67/1չn}'~>^Zr:z#G:+6/3QOFlCYJ'#LތD jNIJYŢ*Hxy ՖnbP\7K31J h{zSKvav~6vS#)*Dc37Q^QX Ҿ]-xaCBa<ؕA~)u.M#} ?@EM|r *K ( oc43=!,C'sp1:j׃0GXJkgM5)tɊ&[$}A:F"\1cg=%`C0h,MDOft ə0JI/ZD)mQmo|k5Vۍ[{RAybtiSy.6#=HDH9iO¾,W* W AL6v>N̿λzvE!3jx# Zj:NggX=TLP2-PKp%\AEf'gbg<؁sLn-6 z, Vg5},-\IºVdG:_WAWqcI Njc O|/Oܲ"Z>n+Y,l!H(P]%)@ $BU{DʱL&iXF٠%Ʋ,:*ȍe+heL8s~mG2vZ>Ördq<<>DS-6v ,*)=syC歙 ]ߢ[RHi`G' [6TW&$"$a8юM{1;Ek'rH1K=#OYhCuL6H4~kj`W@J^i,Vj9lz`&jG OsžA'"`Z~mPlTq:af!+K܁gh_[1P!/Jbݿz=!?U_`D^*PH5#&<չ=YB Ha\܏Kl2=ќ')m+#ʿsD|$%Dfb{E~SNrrLT&g <21aRϡ(u3: N$E^r0'; N'~!\Uh<0V4,|2m+h D?k1%͊+Ɵr?_ys. S=yҦ|#:P W ݰ FjlhZ;'i߉>HCh}jf0-_*^|:Bj֣dh 06ADU9tI(a$!Q!a%#u=bbT@01YatǴ]jdEH{hZH~=HŖ3 VT,#\AN@rb6̒2MY&QqW.K,7y!sb#(D7Kd H ,3}t4ȉqRk`kv0Ra%a"uV咡{: ,= h 82,϶y*Qdm  ^ dR ap~֐$=AamSzN1U=W Ea Dpu*҃-|`Q\iJ{8Ҩ+izyI;`>h=Ʋ v3 r8k[zأ% k1>?t Gkzsu׫<_90m@&2'Zs%9ۈHLkC4mޚY84 )f'i{gj`gOA'X3qg+8`gC,sv.\lm~j`W?m=Ej-/XzZ_=m?Q, Q\C-Je ng?CRݫ+x߼BͲz \$jHdHF8)te)k^q =rG4 \"A]H QC>&8X{CT^ng;իcf [@>Lß\ʨ*+cYb|H~r!Zr&f.ɔ'#:>Y={G<(P{ ٧H! %\벇1GBBkAV=fp=bLMGVy+Wnb3c1^OلX~ܛ) g6yʋ(ƹ": {Xm<ؕWi*/CFiڼ* ;7ey~06vzS@%S >TU5rM06-y>K?MGU.:b",It@As \1I ];W_:'6}mlqmOρ P?VԹ3lUaJ1v_тyIj{gmⱂx1Y. i(?)} r`z!KaG*Kxk@I+|N0je 'Ee - K nz3v"f,{?hB֮NNYCfIHv[J6MXR.Fj (?M3uP3QPmEuk3&+77( Qh7g%e^Za0!]μ^Fw`:+u⾤Vd0ŗkM^1_!g ΟX߿-M*SDC 5Oy*=/VRɶy+L;-m(;m֬%y2ќIe%kHǒ\M`7j1x" %r;GVfW}qbgpbgRIb<:K9{L<k:kס Y pzBpYpW# (v1JUJa$qI>C.J槆ZwL̗h%Gyɧ3Ȧ2f+h]c-Qs9f쨼̓݇OG*MI*Ã=~˹<.(XUR0(Y|qAW0ii*ȜUD~tg /:va <¬92#k^ f)3&: ib)[@%s7GRaiWT'"ivҾܷE56Y#jl$W~{ >HY{fDL6e ߏʀbApAsTp *&atr>V.a[G[Z]V(.ͽ`ȹ%q^r^jC9%tDxɞO(5RG_?螮 0";:Cp}N` )^7 4, |cx/<}k޿X2}R2CgÌy_`Jj`gl J.I/Zew22,}Yw_6m-[:\'2Cf&ziؚBuV<XJZHA1k_M$rSS !}K-ȞED]H2f@e??gڴyFf.FF"BTYMɛJ r lYݍU[ፘ~ꌴv|Fޣk} >᥻3L}=7 b.KyG&V&XKK"ŔʼqA, 'Jdǧ1AYmSlw"٩$($ cGMJjI X*EX *VJAH IK1df L(@G^э$mW mlt te`GR;at+՚;Dge=fӋr EO0^N܁fh.c8TI^,,a!u vA/Oz9alv}戻Qt8鑪.ɓNNہ3οZxHzRYQ e8at<׊uɮ? Rvୡb28D +>XSp'"kȷpgzP DPH98}S6OewH+`!9<[5 Uр0YU?ؤBC10u"`7p 22Ff.F8 b#Ad X pJ=I/'҃D.u799- Fc2:;CX;sǰlKѺR(kWI" Xhb < 3TX9:e,zo<"E|U:2V8uk8&xcv̓]Z~v˹n{1m^D fZ06Hzg(#aX糦?Zڕ9\U2=shñ]NSʗ=pXMG2vZ٘ŰL玟h VJHD2Dͨvq8&\"Asc'T1]IQ)"DUe+7Ūҕ_i`WfcaFaڕV|hʚOX&Ve-=;cMk/pCix DII4T6z`_ߑ U0E@݊5 b\9μab\`!?DVRnW7>4KqzN h$>}5<Xz1'=!?;y1E)8I{BH䱓vЃ8hoȤsu#jc6 O4@IvqXC}@0/ Ғԥ7K:/4"aKcd&VŃl@]?(4{ zM ^C¯9m/rttd䱓vЃay;!-#7 ×'p'~/pÜNd1 E3=vtz0.9M))FFM"&5djU65 IBey5 vڽ6 s~׉td؀ kkB|`#!|x1t:ۧz! /dac a$,KDtJGB$mJpZۏ-P"'Lx|m/Ozi;`gLI(>@#F֯S(=Um p{bICPathm<}Kh@5hskY/DtJ fμOuc,nBEj=)s_|ZO*jlR@>81Da|(DaaQ%x@',ޒ cFUIĈD2R$~gQOBGճ|6b=h _/)߶y׳BYopre"YzE~%bI%AZ#Jl̓]q{@,O t "f[sp?Z}z?ڶ}#Oǎz0kVQR Bbg_s α{K5[!\C K K+pRkg'Ybnս6vvpzA5iO^!}"G=='}B11"/;)*#ZD>[ӄ fge=.ɓN̷rעZCu%M;u 9>Q\1S_QRmOOz: ,= Ze?Rx'{^e~ R[xzc n1¤b~Wo_AJF qܛEؓ3V:Hl<䔱z0k7"+۞k<ӝABMyg.aZ?#ZDڅ@'A~ nǗ!0Hd^aUCŘ {]Gw"UX]+i |4xߊox085RO8nP.M,եUuuϊby+&e;zń NaPY}-,!{6veFjA<;{U.Z/Mc dF$@D+gR$}=Ҟ%Ⱥ WPss5> nF_b}ES <^a3T2Mf%P+L y81/5h<jZFs-Tc ?kτ5$,2<]+v1 ֓7Ȗwv&'k?eR)Zנb͇2g LX T!k'rN% e 8ha;J;0a6}L[ >ִy+lKT-5M_lV(͸bݙDO#c>WANWmCu-Ԯ4!4k{B£̓]]]&&D!lD(&%Ft\wy&U:.^Oh.W̎V54g=2'WmYHBNJtu.d&@bqx{sZt _jz~N+З'Ǡ\f}e-A;G|x$8f)mq>ma{>Z SOFqo>=0;oJ-6Gzjh4Ԉ{TFw gilq"Đh"e3QA$ f X*IJ+{}]3Q;BC*A!b>Т04q N hVW g#Xʁʡ\-?A=b]tȂc"'e1c3Ppk{jWp`{Ż\VU UP`AmQp0q),e 2[ѧ5cP sƙ PM g'T%LbXa<0K,U]?>E漿SAzn.dKz7+!AZ٨WpS UX|E +>/Qn좟~.R'F M ?LS.}(Q5z9it^s$/I/mtڷF >-9P/FLKbmF 4ڙ>)0BNkvJk|D!z: 5çj# pG՚j`W&kBHq79tw֐'c3鈄sUb]6tR벍!/}ilBp~17j.%PP[]MR]@MZxƭ 2V¢}V s\M-d4p1?$#P}u&k+I[-Dad@G 3,(N#VLJS g9k]RbκO߰L+u%; "X\՜[;S ~6&[f/̓]j .tذ¥#)$ZZpCLϗs}`*<}|'OAy?xϱj_Ae'H烛%cưa-y_=֋qksHt/[-,TxZj> : Eǡ\lc16+FwdI+L i1",O0v1XJnza6Xzʒ? o$yMPEѻ#J„&? pbL(w2ֳ0ᏕRABÑK݅PXPzk )w sBύT2I'Ѓy `RcYF YBU iޢOi)3n0¾^`CpVo&(40 @L;{*'P[$jAoݕꊡo!_y ԯ T0y%bXq깖w6vqK$ySHvJiS\o'г9γ?>y0 KL<eY_0 `ݑ0VK(kwIKڞҟNwOdYdT(yEkH)ni%-2Gb1Lm. 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''>cus3#혊 =~£r[,H.[tIS;2z׏`0 G!.[G]`m)!V`\~s%~Wc) c/Vƥ/tI76yt3/cW>m91QPBBITV΄I n8TUy{]3|y̓GԐmZR)Դ-,eD@-ɄͲiNכ@ؕ^-dL'l{Ū0P*.:($D "Mz,GZSFˊm2Z?}Oz1mƮω+k%5nkbؕիtE? bwQDX4)dmY^EK)0 {-Ve y"~+qQ {q4UUq~Zq@VuIzIݩ!%Z>{\j0:uR]ڝ9EE{?ϴ@3I/'҃=2k|MXNER cqb"v1ۥ ԹrR2aEˣ3cd„J LvJHK%:R@c2Ƭ7Hnh`m  sF+_&uxDNvece+eN,:c$Ĝ@ީ -{'V [& L2v#}%f/i >n $L@CE1 LžB|0Az01mw$B(@-8A{"`e|Pj`W\,7w Ji.)Tl{{U;{\uȪI]v7PsYo̖_jN]f+|PٱL&H\,MJtS,ia xd%D$lk,t ?QI-P:rbٌϤzYCG*PBީFÀ^uFo֕{- 3=[LR1{Zat%|vu4/ p [ zݪF< @"W*tXz)ۭ$mF*GvDfX4POIS~g:mK>0"! HcGc!E;!M~<uqR~:Sg 3lo\d_%\lOF{*y`4 {J~˯ Ld2S蔁ؕXÄ|inR zi;򬱕m~. :9elw휆RXIWX/Q#cEM(9<C?  BU-$f%~7 x 2$ޭA7iBBq4⎭l5e>݆R҃}b.5.GF6v) bh*[4w2 (l͢/^:M SX`ڼ5;AβD5 XF[x(pǖ8Y:m)bZiwF5k7*DlYD ¿ac!=՟^̓]5Tz-S7muE4kjsH1M7U0tp"ZѵFև>X~`k곪)zz^%\^-/N7(0Cڶ}\WPaf 2 yz?>Z1u._! ؘYhN3"w^r)#>W˾3B$h.K.KkbLXqM8J٦́`ةy6oc&(缮R )xV.-#0<2ZƟ 9r!fuPʖ. 0ú$т\vSw`LحDXi;956*bRҸć0:Mxy_)%!ݶyyq-;RQ"C=xx& \ęm&Fdg9GO*MBﲬzD?'n>k>x0SĐ% ~IAE$an+ 񘫬h ujJT *'J݉G3RDX}D%:q wãaTj QFRQF,lE✀¥@%zP+j%1M$`26 r{RH؀jPbbi[MQ3MX$\Yp}r!_thm9^H-aeR0jؖi5;.AXḦEihT31&(OE4ѤFXwBa p+xD[T9;R 3}Äv J&$I VXy{{~v&]IlBF蒑T9n 294Kk.~ш.:;; ۓ)? U2@,M1*%4wʵeW+3Ug mm/"H>ԨiPZ[Ơ:{0_+iiHv@dk1* Ep!8Z{kݟ^z d<}D^"t5G8 wxMiWp22^ A U  [;1V$GS' ~Aw &A(T rQYbbQL#RL0Ե伌fX*jppbdmjysZm Cu]+E)y?m|LX|(<?uBs~1ɧ󎝊 "'HRaRls5 {t v fW! |ƣ9[!uce40f|v/sHɶLJ:⾚LJ"V(}c$ u-:\8 Q أ|zw] ɗjo%R@vH+!; R9eunFH!=+ԖU4_U&k֊k53/d6q8c 딓 %5)l wF h`7ee'(m,y_~*#}C% bHfwj[\:t<ޞWX_7a0jfd?7{ (Nt TޭAS^&Vϔ9Xa6Z{P4mcpiKE1/bEDQ{"e~l?1]]3L ;`& &>!+1TʧUuUٙ^FЅ R|[*ٗ.;SY3vbԤ)tCuIL}guY=CahLt%Q5{:s%bmMMfS93[9U[QTR6#r])dI S!#pȘx` !g8Gkn&71̾&g_?tU){a|@Ú%gV-Q7A4NHx-;><vyq_OlS<1P5A\P&=(]POvljvo #ZQ2,]o=avlAI*H1`R}&RPk)t䈴ir(B>G 0Z^>JB KkGh]ٔHtD X!s%^;an(ߞv]+s Hk)KCJUq\!%E(J)d,*5FN?qoqr>@Chh;93+,ߛ½`\½~^>+昱E*(]}˃ӄ֛qOUHZ;A9oߊWc2϶NJ@9lYHMbX{LaU0ɕLL[Mj"D ~BH?今n%}jYAޭAtP 'kN̤pj|Hk|mJ1Pͷȹn[7A2 r h& u!܁.$k -QSP+sDØ]]Y_Q?.lьv l  .oci)ε!aTbC{',L %0}0G2PƮ9IKy/k%K@Bt B1Mڢ9kR4x0){̬OԁYi6BVcb"pOd&5Oݔq.YSjp/u'97Q9ߕ;Ph -HS!NGtº[:~97Wj#̻Ccd׼M" * u؉n3p+%x #yKw;q5 Z_f~1&~!١2lPy7O͜fRA ̯ s38j"vLJU+/ 9]w0w wϜcqS 34 PCPLh> ^n=h!1t%M"HA9^hۿpVLgWOmXp Tua/x?ik{~]-D|ޫ (8VAǝL}WM%}$Ǜ *IYDUZ;Al,\x(,2R (FgORIrx)ևPC3J;KP17 DϥrO.kd=Al(1UnG{科5\J*$OJAjD#)^`]kFkؙo^ep +HgڤUV"1,5:1M!Kia ɫ[͢!) Ͻ3L7f n"L#P}@18 r^57hO )"נ/%2IHQ`ĴK^:x`6',QWcbfUBdFFs;nz'eɫ qېPqj.4h} )Ș~ESa`f:VʏӶ1}-y _žA7%;n<`N-1!s -n;>u(Pga?;E ;{+yMvL$k[^pϭ}3h!CگgȯɁRp)Ȕl6 8*4~ӝ&ZX嗄?)D-Q%V]=ln >JH黔:lVJQۤe'VPB?XDϛ+}F`­:sM(!z,BkWT ~+`yVLD:)Mv`ST&!Ɩ! CU&=Ak(,agcg^yt}^t R `Q A`Z&i!HqLÀq B V$0 u1D2; ˊ=PM鄖GTѝ{״k_T̮FiEԱC鐢=58!Dp Xr*LMfVa,V%5V,b]T´^g TJP(S#2rAE0Ƈ1(5,=F/Ѐ*L~@0c;*ʜ~aQwQ tswj84u&XA`A2m~YL49J "^U~Iݐ3:.<N14n 0Il=J!ƏlBjVZ#B$R*ϼeIWweSwl,,-.k3 k T]+l"YHv ޱ;}-*Zs{I NTJje/1Z`as+˜$y {DQK~}hZ%hfW%rZ/ aqs}AJ,G#$t5gTav+ˣ}ӕlKz%ZKgF}r^r/v6X1,YGYz35-#J_]`&|2r:/ p) #Z|2˅7a]{~6ۅU^R;&\Q4պ~󰶶3GTKqc:JkxH48hvک8&o\B;  bџuH"y j[a#R oQDkP&7;C R Ꙡ+$]25V'D,50~\-0&iYL |HILCŔӋ[l8-HF  "TFjVtFt+)ef jN\ra]%[zxu[)L!dG*2_Z/0~8)ABV'fy0gKOy0ȟx(l>,RPnGW"L`9B{dSL"墄Yu~R#(I]1oDR:cHJ!X); O'XSuԁ&_̰n;P[LrwE<XC%no<~C,.%ja(΂1^X҃(4hw8m[¹0-ьlH<˪,s> GшYէ>ЉR]RR.ʶ۴Z8Ráw1bزwiͺWGM;l>]-u[h@H3xmf=0%_5>tpj|W߱$v]#HS"JHǃA7 A e vM9t݊k6F.c!63g@E aj:ɚ.rrׂHJ֏X(Q;Sz!eˡ|.VJ BoV%6[e5AiE=X<.l N]? a !(rsCCPnH`,xdL cH@z]wHJH`/5o`p"@!WJ 0!%`Z qpaz)w \;(FMX5DX:~|xaKmF"n9¨J?9#,%*A2-dkYM(eFW!ô]9dd8jDmA J kse B/M2'߃P{ƖIETI9^YLPa/zmDfy-*%c.@ 1kzN*+SV%+Nӧi>$M[;궼TzPR & įk8g 3,vHtv~^ IWۄ"fbџf4 TtBŖ2B_OyCd -e%tvYg܌OoM8 oL(]z/ 046&'z< mP$tfg,e`z-zc/+q,skE.L7/MNEU44<ʒ9ld㺄>֤i#w;X`gi)LԺ58lK0 $" .1ewJͩ̄D[A$*OLʗRsHsiNW_;t@S^p1HҎ,am1gH|."9Z?aLlL `q n\F *CˏpKXNN'UMHHM܅XuV lb蠬 AQ^V3 \s>Ϥ-55 -W* pCI8"S+8u Cұn(i kVdMDHpv)}0Q>WA(A(a!ntZO;B'kQ@@9$ @L\ڽ1L[ Hu'bR/+ҡHZ-'_t)i"|$EF[J`UkWU?Q(zIJ7o4< ̵}pa{IaMMvN- b0wtKޥN#qeOOVe"WbV.X)i>ϊUg(Bfd@6Sc61UY IB[,)4c^Ip]T2WŠNgJJ=qT%pTx +‰Rj@ BДX~[ҸԀt ˃E]R? _F4X7Mk0>,Ha )UgX$LDl| 7bA$ls2𬜯ES3 )ٝ{; ܯ[GU+㿴޾P JFMը7QkOSh\eV;JFaV"Q DJ/ % 1KP\J1?HKq[/(4/Q_–1o6lY( v%!W"knlH3(soR!+X&,)f$C %>'dg[qVJ0fi)aiY~eazș.Q =Y ERH @H]I@Hcn.`S}.7J4kȿUʿi,̃:{z"އz ^RAnzH4Da]dUpt7 frh8/C/ҚYNbGjR]ӀV%mndoͪ_sR')b풙k=wL|nN7-k5~-V=wo}.sUzDW$3-ж `A%Mܲ! 5ƒk~ 0DŽdV il(7aYGG催dȟe i JGi A'bM+gDz劑^!V(hL~QjI<)Q.=Ga$qaŔO?F.:B/H]^rS Q!QV]V*hF@O.,J%y7$#ks\i2ڝ[NV:c~QE#cHN'8qFϐѰ:̑ \iB!H7,/`u\^\;XZHGhH˒StPs`R; vqN i'3!ϭ62tBORHBv KJ& T٥''^.Э_e 0q>^U^3Krem7K-5/wPJYQb (' 0FcR9]@y xD]-8#>>= aonj8enfVT--%? wޘ8o H#*c7toSEuv]^.LW"HHВrxb&\t(ib($/JX˰ 6 :nlBX(YS20TύR~{9HoYWYЦ]6bR X(SӿΡ `dâݜ [x'fPW`5CS/WHvWWp ^*.) ɓv2=$FtY\w>H*evZ;9[,$9TXzD]#4Sթ*Bi*5Cqѣk`?a󪄙 Я s'Rat;!|O4n(`-Q")!ھE@jcdDFzZ9ضvyrU| ۶w%Ӏ ̀5]zx9ٌµp/z5==KxqTm[_oJIGp<-7ho/ v@YMĹe1Y? O2ZZj0 N$l,$z*8qjG[Zs|4 UKd kơ^mZ"|X:&,avAHIK /]ݤ=VYcp.9.װoAٯ(եe1'+R[; 8OsWn!φwZ[Ⱥ qQ՛Zvj݊:JOrX`SXBJJd0ZU:iISpYقRr&% Qyâ< 7Vf Qu1˦$+] XaA#mhP@ohq(t^*s0",N} F9UD98`vڮZ8Y$5v$~?lxb(b1q>vM۰Xrɕ}aP#-KJT}jBTYs?eΤ:f ۽PJSmivWr$nߌCpbW#Tqm\J:»{bZDj NVNoW9Y hsnKzr13 $'3B5% seZzQ|)7aS2I)lU%FVׄv#R,J_R׶l/O{TJi*emWa\_ ]h[oł2/Z/".aQ7Y=*wbJT(ѧԢ@-R9F،3gW+P_E))~C4W݉UbIΕg[ a Hj2\1EBkUB@u)?O endstream endobj 2577 0 obj << /Length 2718 /Filter /FlateDecode >> stream x]s6=B'zB Й̜;M&җD[l$*Gҵ!YV8}EbwOٓ/ BP*.&NTer2[L~M"L$'SFUyɻ7z?{{{ybى 5?#"4gF̪'SӰ~J5bӜ4yY1|r|B0JqJ "Ze}[ՍyIsBurml(m.PaIVm}"i sh@ }fjI9MΚ&_L% ލۃB ?p)l]W8S_.YdHtMerY6Ey բvo(u,E6;~4*:1Wӓ)7j@633ryWM1A'NK? |03T^($(W5Y,"Xy\‚`..E~?Chm{ -5Jͳ2Mh\tg{VAm*$mf-HngÙ2Ƣo.l.3ݲ2C4 l\<`S(җrmIT@x޺(5@A`y\?@u)REI^pi?"QjP`:ɏAh rg=UOqgn#HI[ *b0$R8*\D}A֞uD({r|"dd%<7]VC>BUFw"1''e1;"AG!()-}RvB+!yT[;uįb:dV(W֝Wё PqSTLw##ġ iJLΦv5+],\=/&(ʵYlBiM/xw;u7 v˨޺۱h}P Gс_G9H*9wi|┏Ψu8\3K:jrau> stream xZ_o80r2P"ER-=]vKE'ږaMO3,9J\\qؗ xr5'<&R g̗TMR ɼ|dYMEf dś,Q62b:K~| ͼ|}4?^#'1_9 ޾Bb3qYeqYL"QvOp4$4TIVg/)AKU/unD) doNhݮ]E{~}pl Ng6#|d*\ғR#R!{=}6q$p'>|\19bg)7&cLvGO1fdra=CبR0L4=L,{8R`*JLiߠ)#)â)8hdTC4wW{(Xe=V.tP=hMr"s]9ZގmZ6S(k,a"퉔f&d8TY 0qS4ވ:t8tY;vJdž5`_7UIU<Aj@u|Ρ ]f %vE+?JX}z*`CPy~ph*#MnArLjitӡF4ʢ;JYaj2G3ьL#yT` 8FPC@ZkʅgCiD eP忂JxJ S\e.5eǤd2$ >ږ'ч8ȆĻ5$ḇtd0B(å`A,' _/v%ܲ]~L:PF )%91qGs?MY,gRwCtoV)kX-Re 96GXG@dKH7Z%R̅| jFkv tIZm-1Z8:GTRه {Ǎ7LNY1spdfo2cYSjuFAq√Jps!gè Oj;_k7!;,])7.*jJ۾+]Ask)3u9$PIJ` q<{* ;3_fiE!Z]k{k8:bI^'7ӂ;'5@EŻcRk*oU]rJ2uD%^&V N˸-9pKyhN[ʗЩ[Z?> stream xZms6_ɗw_͵^gr@KV/(v:oA $%fSr]:w0VHB%d4bf2T{i# FϭTh CIh``$̌]e@Ss릈B>cŴ(+Yt݄W~Ţ#_B fH+ܟCH5xh@L&HØm6hHM*q5xJ6N՜wC.so*ϐ$iKI T:k0erG>4K1'$0&NKMrJ8t(Hrk_\eQKQ#`֕@ /4&CIuE]xtm'Ox1զA'tDO+<.j %.%9RL43 |c7bZ|?&:ZVF+:5yZ3~n -,*U~VBL5-'D* E0qn( 9MK4pF)(Jy q^77YS!"etڛU^tۇY ٗE59BZEHe$ r?4ZB:oH,`kOCA*Dqɯ.<.اEyb 3 ח8"8Sě7k8*-+uO#QP.NjƜe1W@ Ժ y *xNmE߸oZvw |C CdK.rs(ur3FL( ?/l亮NkOv]dw ω'7÷S-up]djXō펒 T ?:@CAS4*$JtoGs'}wJT2E^d Onv_;/Sa3s/~xaq(ҡ<ݑ~Xׁp7f|i-7tf#ayg%Y T/JdˋUBJx3J)W}W=dg m<&Ev.M*!Q8̦s~0PA%U$w&$g9 P. 8J55vs]$5l]˧Y^ݣPi X)wX:$o[ha䐓ɇt@- g I&{?0h]"0~ihTc_pCʃ[9Ц͙p"9҉=ܣRH`9V]12X|<;qzb$0'e|4*_ձ y1"cmƾs9YZVth9vd8YZmpG,-2Re䳠e_xYyM#i{%O;R3F$҄viT`gPCWDCw[M<ǵˇIr|L 畚"9:~fvՉ7nA|NUs ':ѓUc̜3$yPcrG&?H\xAhdy}P'B%kp"q]Jc<=,c8IY:p4:2JKW`%'=:]܄:7o C>{u8jE6+m|b8naPֳp=&8؅0ޘ O._ܣºɕPl[ 8vv!b +ētJUrpzJSx } Ý'@6t$/6ϳ*70н3]t7o2NG3Ojea!FѽjJZeAx:_M3}TS|:Ld<$OҼɓ[9<1n=;"/Eb0d endstream endobj 2597 0 obj << /Length 1841 /Filter /FlateDecode >> stream xZYoF~R ރ' =ة CH$CPw EJ%%JyYڸwý듋z ߶io4&[070nQEIQǰQ:Ը|Z\_|w17 :`Mzλk{>QJրzYZ\d"9h+qXj>i;UһF>vn$nsvQyW5~m\Z8=tl5Bn$nd?L/z ћh`$,c"îkL?hndhG=GtGlh)(B|AR[ܽTVy>r<&Ϛɀx6bx#^Ay PnĢpY!VKpVMЌA=SR!L1?8_n*yaV' lp7(e?,<M ?D3OK _]s5qvqS!v3קZUpc}!>Ri۔(whDZ(0A6CNt'dzL'ѲLeհ~@_'!ojҴQ R} U~n<<*VgUEQlTz},JYmw-}于*:Yw!G2pAr/.A\!ՆQyYU[גSKqa]xV;_-mH!w+hI_\A>$wdr<]Ͼ .. ߰By;[j"S|8JtMrD@TYf+~x njQ#7+XUwe 8mQ$1&:՝AT@ %Y0!F~}C?J}n}z$yhfK D+U%@Q6dClD,/N .<8" 1_&~؈rh=ΝɴSxS2'|)`D'0i1+,ne1#+šZ`0'RBE0Ye&<)$B5zgD H:?243Oe%Е,Q$gB'xj \#JƋ2d03b?1@qu=Jw-&ɸa)~Ƣae+kh|xX 1R2t.,P`bJҗ¾"Ϲ"&ZWNļE !Mk{a5ͭ¼"ӝ E31b>2Sn"jv2=! ON- tev>rMjhpjf)XsnVFJy KJjgY-/EPNs&@K5C57D~MDGdžˈHPg+kks(Ծ8,Tâoڤ8EāxD=#*XaN洵b*DL1"')Vv_-̶lM&@v0#t1d^]I"boPN#,)pCꊯSk3<-4B qHxUw>Ю]xͣ(9U@w!P7]'WA 1*fZ>psE~]j6);I2M@09uJw|7!t0bԸ" Ey̢Bfv?z(f endstream endobj 2601 0 obj << /Length 2296 /Filter /FlateDecode >> stream xZ[o~ϯ[eZdmA=Fh(%$ħ3{!-nbRٙo;:9tɔⳋYgI.b52WIrH4'4\$%L@ԬaBwsv.,#g/DPf]m,NW ^OHH-̞k;wgcΚ}'nXp<;;Yp sK]Uy.đ|)K)K.-O}lp^T%FQSBxXۼayѴ[k; >ɼvyݬӮ ټ'e*d%$KSG"3W>"Fxxuɫ+~xoC2[^֑/^K[W;YK7 uF;Iw*AT6}Ik!xB(X<|[cJnծkʥ]:} ZVE' )F|XT\wEբy:SRDb5xw Px^׀|Z `kW`Tp pW4Wu[vc_ldUSؾSS|X6X4Oʹ7: ȵ-h >vSZmcST 9b\oIZ=A+3̿?g Z4MlϩhNT5$#U7Gr"nDZOvo.2EY@v.;ශVCwWUTevyu3}۲+R&|=~v}ҡ߰0u±`vnb=ܛ ݙ*qŇU.Eж M߮Lx(RqhJz`6꧸)̇Ж-1E7uZ:bD8`xtm:Gk z[p:.#%RPt /ȋ .?OjK4&lyL0$ vх9\S9 +o3=!KsF[Yu={{S@j0[=\g%Dܜ0_LvnmC 1 ݍ[s.]w{Bݖw{@vЁa 7A }%}}!*{0Z81pjzD->^t I.ʾ!3:c;*W) j7Tbc7xMCekH|9:qe6M$Ԕ>5YIie5Q vȣ4!+nh "Lͷ5 um`9t}/ó(~EHTDBN kw>>(J(r9rYў6U{>9Z%#bLY0krрv DTcUʞ f(G`q:\fO]"7DeMStXRzⅪCb`/6 V;&3'*g# bj72n731I ؆||Y07$_g_Lmd l>K5A*PtMy웺f Pqa9g\񔇝  ;S\k6p:??I|g{ٜ_b Ѿi"{3CIA*x6Ē Q}XeNzȲ-"#f O`" Z6_Fm›Q[h Tkt&EA %_Fmk +^UX A2( TxΎDNx)6\6Ggl!2J$2Gnd$נX QbRK:ݏl%I8x~z(o~> stream x[s6_US0@h4$\{3EH?d+7ߋ@鈊rv%)<<£~xO!g#,f ~l,E 1ǷWO u,}T]~z;1WX^؈`cf!j\UʅTJ< -7fxY.B|Lx%doQh| f#DvL%?f;,m(G5()CM色S֋sT\У( Q“hUU/ ?v=ll<6e)6 °Yw7^'L14-LSCat60b4dcՅz' BBL!\~}ۮH8oy8w U:I+,'r@źD}%9̒m\i ߓ# isu'}~>Oo'Mxtym &-^bYGb$GL2(.iȧI8Y^?pYr9PЯ)OgW89}IRwx.102~g6yk3&ʛ(u/EG cj^Y/#p #TM5U˕j[CzȒI1TD*(J:R$.[KCK V\ΪƮrvV y=}ړI<$1W_v2w1=O tC=??@gpĴLj&3S܊[Gmo|D$(֏;Xyl$R kgK7Ryg^y4Nͳ%$xY0)ђASBfy..䯓/©q#r SŬI7E>x0Z~Fem|tm!Ni:#{.vKp]dfwDZ 6G?ƞmR˰§607db3HF.AU}7VUP%yy5<WnɘmnH8yhĊuW>zX y7fFXkrWL.ے"f:GvDFgdVJR)#\ql2RLۖ+z)h05FBnGyVVEI~qTRY%F#=jT<+DSOi dFEWE0(&pJGh|b֬EUјe+t8)WK۴Ss`YnlZ&UQ㓂 f]Gb%֘b25Uё-E5OxB TANAF;/> stream xۮ_G >\Ku[m .$DIlDQ )|}gvRnbwn-Gt㋿M^zd#R|4Y4$&\D|KSd?}8f?V(ǀdB# ꨽zQЄ!x‡<&B:zq,r -Y^ۻG\gEmWM"+^|XOc̾5+<'{ϸ(*dprWdoj\Hsb5yAA dbK+$ydy\ykZd.jW*9WS޸}u$SI(x|{'2EK[H<ȩ DqfŵNgfվOL]6*y3Ћ;}[͞4}ή6]+pnt:/enncgDr9D&q鐜$-6R*HZ= .1Cy;)Eӌ%0OZj+|N[\cmG(F+E(`E KH$gR&7-)w? M9a o%CWtqq5woiCP z}cΗ*%q 7?hGXk$^> e22Hzdv+텗Ĝ*:1noU @ҤJի ✒"qugkJy&UE#W<[s@EcDA$Nc;ZH7y]ڣ^2~ZHDL` (9?բ"ݭ E\ϊIDWdE_tԢMe?ŤS_5 !{pH nTKe]։pWdU ǾRߟ'7'7\nɮ=vJ\qB϶@ ꢖw-LXx.P8[ǬDbf6}^ÀGA|γrӰ ,mym0r7VX@6U}iSzptkZ凞sq8 RK02.?ϣ%S>$'m;gw鮞@s);ݯCͯp>_^I^ v ot].큝r_e]Ux"]}, ?|X ]:#~D>q>VrȜk%B}Q23a:B k O%)e7}O70޹LoDe}VY] N=S xm&1͛2Pܔ6@3 z1<ӛUDہW!sб=S҈J ֱ·q^g$;(4A@ݰ Cϗz_M "fG}-p}lat,tF;R0PpBUUvoZ2փ\=m3jevª C@ھ>6opQ= [73 ?Hv/݄àcm1Gv| endstream endobj 2616 0 obj << /Length 1893 /Filter /FlateDecode >> stream xYKs6WV2ă$ҌLN%!c>TJwe;"  8ggQ'af,f8>l>ş0,X2J`=-?="s/yw~X^?b.)Y'< , g4 1Pƒp ;T.sIZm56_=!MTjLgj qB]A7s&I3uʴʼv;=StzH ۨkDsSo Yw=*}AD-Aaȫ;kx^RUsuӨ%g9" SpLM8 :tUmM<(B*)rqA}1#r0ʥ\k`HIV5I%boÅHr.Fc~2=[p<"&2 31nC-kxp0Pm {\Wஅ9_Ng$kPlƕJC$%pt =:!e-uՌs#FjB>8YE @ۋǔ^k2 FD)|Vs'/jFePUe- öyH'94tP9l ~r'V<1!$,HJ_lB#hr#VL"t3ly1>[Z}+Uy'!;pK" vuR$ıS;yXZl T6tBLkP!L$'an?@]|%R,6Hu2ORIcGb;0~nX vn,BT1!=8!'fjojly^vtۥ鯳^j~evA1sAmK!H>) @cvpIwmV7{+<~lxXp(1޺K&Ou*F-wMS\ c!!ִi嶦U{1ƪ"_{ VFwb-d>G>!;vj4v͸ݥr5^j;!Nghpo'[6tI?VcvivV֕\(]6ĉV75BG< \h>c[2fK_}m_%> stream xYK8W9ɀCfdr-FvoII'v'-"ztٻW{uQ:c$AgwYgQ.]:dBN0ŧ<~@ bXӰ0 +7o`(IhmӐ~4[mDŽxSUШ)jUe h |OK!|O/U?'$}]{_gxL_Y+fa_eLeYsRذNLQ\F]&i/7ݞ;`e(KL?|aK8G$惗kIu m&@|RuqQkaS"7WCVVW\̗@ZJb8dH,]}` ajs[Ok]Xd. &gIp%+6&=eƼ}*W8ظy0 H!eFJ]tmҘ͌݃Tۭ(u >hWՐ4yu`yQ!bp2vd$&h%k/> ܩko;zp-2+6@ct>M/hQ@(v"u "ЙF+km%x?Uv;;V[}m~-ǎ _RKF;coux, );N'/XxľFb >aQ<·oon)ޓnbjR%F͍E'qGk`1M^M(P y׶]~ݡ!2~JGTӚڐmS~yy'.?qU]Dr9,7j劤4G 9}eh72Ǯ.6F#wz<̨ҕ}!ѕ$Ƅj *;@n^"$ka U*kmJz;UY)u˭(ucCl d0eS;}ۭfmcQ%W hQ Pi]鵉0=:%E,SѺsĥrzzC {V)."a+!u~*d12 N!cBOnln$^ Q3]v\0{5X7;-룝̏io`gSv7Nk޽PBO`bpՉyʠFxח唈d_x,~s јw-Sk+dʯ!q3M&]Ҳ9+܄Aal{t&f4*M1)k[kuxF^nqf,O?y!"piY]VSƋઽ$“ѧE5jwOb6'I^C}ާ~n2i4rr% v 5e0 s[w(#, zD|KJwB9 Y}b>pTy4a,**[{) ,t?S endstream endobj 2629 0 obj << /Length 2052 /Filter /FlateDecode >> stream xZKsWt Y&Gk-SU(<@$NXhIΟOtE"պT`׏G#>7翈p$9,fS:~n)OqJ5Cp*s2iO%";%xqVk]K yG,pӴpO۔c\^%n >@cJa,<,x=%kɾ"gl,vNo4x)4 r"PDP}Y!b S΄R B[.#IWEutoIb0XM{A iƩ?ĸ*E?m7M 2; :Qx&ٮ9ݹPѴu蚘 pHN%n_eK""%dBiw?C&]%c _]̱72eQK}uvfЧݫwsds/?;ǚǷo?<QYCrc3\ % endstream endobj 2634 0 obj << /Length 1715 /Filter /FlateDecode >> stream xZ[o6~ϯ0xRnkliҡP~P,gnڡ}|R&n7ix>~B֨EZg݃1 ,e96֙ޡ;eׯ/د~7d԰abT: k_p`M[wt3^K9ӚqX20mPʛn.b{l{`{Ijf`4uA: 6TbO. EC> nil|ۻۻ`l ͒h$ۨ4s~ ` (_ؼE vC+r3)7S&1v(nx C"N;u8 ;00S-pCQ&j %Bc^(b"2,]6]y ۨH(0V{AK#j!uk-VԴaWmt{mTv]p]{-N.H d8ز=Z@7iʣqncXU^A.]j8݉k٫d P0xG 4/!i\$Suz*! \UtUi$0J5$Ud5z ~4\.`Zӣ_:o?2dڀsmΪN$G.i:H,(A }ʦ3d t8x^ܮbQ!;/+\ZKq#t^!zPyQs5*ѹ*b E\ke\Bh.22W3!}&dقd ~ }wrq$M>5U"~(I:KUdMKFLtIHeRP֗9gB|p3C$S AQ.rW"dt$&~'V<1] Q1=8H!,]x-$8"=H?eW4@Ӕ]BmNO߿t80M2"U,wKm*HvSHEaO,ӐYz恖L3/5[؂ϓґYO4emncjU?ApȜs`֯ѱ[Ff+rmi8BGGsVlj-^TZ?޳0Wԭ$Tf"p'9lYLҵl>qp{ӛU> q] 7Y,סKI++>.*z͢V~MBpuCʙکnkm$ifA[ױɌ['/gi^<(+~# 㤼"b/†FTo1wve` 2W޸PI(K\,U٭y)h5^+2D;؉6=>|5W,z&Ǵ~jt[2pOŝ7d%aTRE$ BybdM}|FdSu^8{rmiӣuBV9g.8HKkX[rT.F>5 ̩U5|Ý0ml@$Ufql !Ƈ,GGߕ]z/oO/Ѹ>9NDGɏgWG}y\N y/>$-`eBH n *Ӡ߶̚¿/k{/Ѭ endstream endobj 2639 0 obj << /Length 2292 /Filter /FlateDecode >> stream xr6_J1 xţ'Vě( X$D[TuyS;35Fot7hj+>}usv{ȷmK\Ks}Ynl5fr\9>`_s 3pkOș_xx|LE{ְ,lSب0Udh0Wg,/ H7X:fr&fZe)"LR`yC|ǜ"Hp9)Az,IlfQR<6 |o,[nw3e>q ik>QP(p%с ,wBQ<ϫ `k2RyTK$;+V,ʐMx͛f[,.9Z#b͐Lb 00L" " bq iuw s)^A>d@p08nH4M<`6FբWV6g:ú{G&r][їS=l z?|wQu `JD'qx}LP"ϋX V2h1rj6i$džƲ,bfX!)3b۪YfGwmn-uwC2R8"@v|pj^!|g&4WjFۃ[%(Ϡq/QQ@q;% k'.ҲP5ﻑU_N=j"nf[@YUI(ע˾zj" 2TfP!'{2w2Ouoi=S9[eުśP YX]fSٔJRO,I(k tjo5ۉ J5R 1MOuQ[m8}AX ]6h ߡ>D` In\ߜ kms@">ݚށ%v/ cp 0FtnK{ Sv7ܕEVS?Hu!4%uӻo'0 }H8D]XUxޡƮ)|.W`X}\xy vmYTm/ >(zA@o[` [:.3 $@2EY Fc5_5e'W߶(Qۈ uj_#b*nseP[ͣ[XKO:ٛYEi/6 "?L2z3kxyrBz]8:-Epm=l߂ 60A/rX7 bcU?',w!w endstream endobj 2644 0 obj << /Length 2964 /Filter /FlateDecode >> stream x[[s6~ϯIHG&m:M}p@ID"[}n$HCΥy1!<fG>ً7!(.Gd#ʢrt9l*#2oϦdϦF㿚?3=o~=? ~OϮ.9cJ.0""% gj3lW/[h1JPHr+l41bܮ|;@dC!ΐo8F oYG߰O9& MI|Z GQꈽx1O.(d4%HrnE(ru#17F]cdC$9 O%!cS++/V_H(䄧`ȳigL8D'hKRp?Rvu!ŇVzS&qSIǏSpU2ӨVsfg.lXlHbְ.'MQf32Qp*4 ȗy6)EQ dh2"%XqTO$I-1qsIqYJ3te< Exܠ;},EuQ@XH7?|\o t4La.(*eU N9ȃ!gzaLĠeZ+|R?:O+;6O4+Gw{蚷Do_9>"ˆȻ{8QmbtSg56x4-@+˾#+4i Q:ev P ^2Ȁ́Ƈf)MGIF0o,캠#0,K վ[W๧GZЧ@@ajgKa ex\HYE/-u4zȔfZꦍeV-;c b|7#@v <8o߁XPFYC2wRm$v+-"UI >l/1A֗j؟ yԸk}XWn^lJi' f j~}K4 a r|٘97 =1}0Է^ǧ:f7.;P P۾-EW<6aX [DBf(lNךz2R+zޮmXs/^6%kmP3I¬*bI&mgb(P79 e#f.] or7Y)deM@)`; 2ʑٽ 0k-b@C&Bݍ#2A^@P7";n̖ Ij sH"9~yH87f`h=jA pqeC NBFY,Z?ݵK1yH ڰ9B :urL4)laU@Y:HL  "y"dEP sRfc rZfQr<{ ڔ> H̘J^QΚ8f԰:޳YS Su' !ȗHX!9 ڣscI`y }1"VO# ʓ)OcU)G ;^-S4+XtBaݻs5mh#6n}c>q >_0Nr"XIOX72^m*ۘ,7[YQwļ>,C/RUZ}1{K7RH}F/yv oBCHm=v>mL{142p'ܙ=&IUq0ҟ#qq}ߩxM0 6k>ݧO{1>_vn|d%H&I<ޕO}a;4.^Ow{$LJJ0H='Wӓ/DjjSRўfAJ'SS3i`g>9fN:{:Ӛ8[ckWViw< q\P7&yʎt?,[{A jt:ul/zCpҬ\Mu5#޽v%wn^S 1y75MS56myzm\ MBds-Sr__<; endstream endobj 2656 0 obj << /Length 2198 /Filter /FlateDecode >> stream xZKsFWt"cp4<#UKqvx]+E [yH,lAt|_`1WOn~ YLEكlp7$9a\Gmbd7?~?03j-4;6rw^\2_+2čh|x+^ [y6TcjY#&4\Lb)%9ߥht)iFx412wTX 97䘦y3= 56"9S܆~L? 9 <{_vҎU9%;|~6r]|߱;#FDnrUC-0f#Zf4&&{ $}(.2U+@?KUzj ?ಣ5g#2LW&Z ~zXǛEjKJqfJl.Vx0k+U4p',Sob1;aXcB;Hfjo, CUqծdu`L +5RZFaͣH ,mU *_zu]vp:oj]BN3U hZcٺLzi,vy.SI\^y1TZr,Wi%o=$|#}!serEwvUr\wuF6qEu7La_yf.I}Iz sVi7b.o=q 6(P'&i4vP3ߘ+靃< Di3DMKb!hetsRd@x%*2ͩu]G[Dό DIjLYO0^-TfĹ̨ew] ReB[UkITNLyٝm,ga9}>OF>,ZY!u"VM1a`<#lj*K &-Q׌ҡ)Ȳ`E{V6j[`1Wհ|lEwJCox #IYnh ; ?:b55dϣҘ uX,ZK_qx ,u >@c-=M(lHv﮼r1Y]*Rʮ&EӢV;1p Kdq`dz^zE~<+{ qg\J dCO{بb~ H8AMdh#[5Q>ka"AīZD]Io6Htxi `~[}V~&F9tҍ{0n6b21C+ iGiGIT9dQ|E&d*F,\`'aF:]ҋԠ/"F`U30e흪8M@Ewo$>)kW\zPkh9XǺI1+G7%fѓdsEbE4<\W򘃼Nk]Ҭ*ęG*4p/"8ԓNK8Wc#zy.z4vr0`:NR'.r\ }>>:eu~3Ccy\ endstream endobj 2663 0 obj << /Length 340 /Filter /FlateDecode >> stream xڕN0E /+Q VET҇DL J,<3ܹ>6-zE *%s51Hm2ZgH@*R;QYtH.ϭӂ( =F3Bft]7"=XچAn(MïIS D;^.wzL@biVpvm]}]nSaӕ>5eAPEZ_Hm~#H( ):BϨ?@X/:Ȝ@}'ּ'- dZ"M9l5_ENV endstream endobj 2651 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 321.999 199.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2666 0 R /Length 35 /Filter /FlateDecode >> stream x+262R0B#0˥kag endstream endobj 2650 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 2653 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 595.999 420.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2667 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaP+ endstream endobj 2652 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/leman.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2668 0 R /BBox [0 0 596 421] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2669 0 R >>>> /Length 18863 /Filter /FlateDecode >> stream xK,gkE# 4A!Lvf?թ}O-+-˲ޖ_]{=o?mKӸ|o3WeM:[:h?Ò~ڧ>A=X^ *O^3MN=.'!/g]* Pt@D,[tpc gLh9͆uXaZ>sfG)0>>GD3}wQ,C"H6)t'r 2Q8z,g2a5~ ΟpB:GsK?yyY Ӿ5Gf:`>Ll9FrL3Īke {C|0hsw`uiKG ׷f||,DNC#EgXDXЀMQ=K)Rhu:BJvT-<յ?Q 620+'FgyFN._hX/2~VeJR֋d7jhڧJ kTئ9> (ӄ6E&k4m=>cEh4eTH8yTVi3|!+)XS v Pи\DQ)j$+\C^͸]BMi XWx_z`٭G&:`ڈUhq*0̴g[O &E\ F-:pPς"gd&2Sj{Nq"6=%04"2:Guy@; %k:Ø&z<\CF\ֱ4me=qfWf!ΜLg%,RVuim%bqOh^AC@U92e;2IEgO4?5+uyf{vq`yИdZwÞ|^p:dX͙\C^8&K8$q3omo^,S::oh-g/d[]+Z Jbƽ㌖VZVDQ]!AI +ØXuox9`Fˌ=A&+ǚǤZy,|WFaY엂q= 5%&Iq$MOV2e%2.X=B]dΉ8WCz;K">o!)(=RDOr]JE(5eeDZp6G6Ӎ*`*T'!;7r}ysyob;†HF L!(yg~o m (eNG@` Ocq5}~>*\D.X(֐~Kg#9Ә~KϘ(JApB"ZCF-{Yn[Ц wF!eFKwfQ@1S"N>%;"u`,@C09VLA砢/m93h~kagZC 21S`ƹqF3~kr-@UOM:D]sssmG9KSMM%jotU%H(I$NHɺռ $ FUaFBUQGΨz,J S*I)5n9CtqO=K$ss&p]FKdNWNk5{~CG Tz[Vo%P554""j$9f\ڍ\  JKP|}Vlq7PF5Qby2|Zby"lӭe W%Iy \t2VsvvֿMZ*|c66iKyЖq4v(8Yu00CHlr2&[,`MK%PAk(p&Xzu}@8~}D:J 2`K 8 K[=2$1i.?~2,KUp5'=|,XדCh.͠CV qiJ Q$ P'IڣPV|`=p[FH2FH;A6ؖ(1Kڹ# }^IHy)cs q)wThc| +Ȍ{n_p|㥁l \Q;;zis- &й,́EhuBBK(E3*e͑Zhdn.;xwgl`NMӓNHf$'b蹑U/YjE:fPꌀrﵧcw\9'sTnǑӤ?=X kgrsa<ꊅ3 TUO/I, ->$)p^Le֐@iZe4N' }&Iflp'`K%`((Lh)EqFB"E+TV^٭Ci>n%CQT4$U`m%1a%;8ڻ(a J<;k)7j%I=j% }) BONo1#d 2u sT2BP!Pehj *^RdLŊjuڅR>{ Ak64{͋IupѷhF-DF:v$$&s3sOwAā$k| .J;6plJ,,FfNA;tOHn1I[uF Nؗ[~[=ʭHuYH1e{bwW㟆K{ڞֳ 8U.,0MG  P0NX`?a.k)pYԯQ` -gQd,eRV5oC\0#1v['pXxqNr*4.)4ǣdPsgt/2Z 0fJDH|jX+4Q;4@ l~&fԁ`gQĚJ()t vRB)N.jH(/aa>Īv94 4:J4Y!(2λZI}/%k@;K"L'VՎ-wKf˲ TeZ(u@,H ЦrQ4Xf=H+N=Xl)Oi>x9 M4Gb۽msڤS7X{ /J;~KkCs#;Ghsp95|z+˛A-Ǵ[0ǽ%`2j)Mf翢U!/+Ќ=N3^D%1>\%+@.Eh3+M>y3J):BȄPg&鴃d$Ty~A:D6"8{׬pW}l'=<eqǦ.x9lW?/*̨x!UF(rT(Ɗ2d~7("z(oE (VboaZyqhT?t\Ũ$gkwӄSG)R# 2Z^KiC.hdP 79᮪:KlCl^0CJ*97X'lP@cQy 3^⃂J:q2 ^ O2 4g ifhJqwI"6H#cք=(f!uPf$81بbli {2, ۜwA):Ȁ6A3*^.o 9*@f9 /;2dfVAzP'zȀVYU*ZZB$t-St}4s'U=jBE48BWȴ1t銎p0*Ǡ}~#4"A3&Go+-XNHA,SV2E'9S(J)P˒ŵNYU¿H[>#؃]lv0Q4ǯ`(o%N,7SVZ wYWB)a}>0hjS4@/F(9Ì"H5s%-x9 EOMi=ct[0olDe'PXAňn+zKQ%;-U!^=dG66j&:`> E{]`t]rD^ I"xi6<7[썊ʷ|DfoϩUWro%pzﳛvϾy(}=dCV,^N~<&wZ%=Ӂ]8@"/`| s]]'Nӌj#UꈁEk- ԕ=Xh.s..G;Au4; FX!kPR _![(t5|Էv-U-tpݩ-/: ^$ɶ淃 p0N(h`|* 46 #y+cJS)ʧ__$ HQc7j A dpp,*@d`Rm:J)9@P\%Qx:;ΆP4)Z`gL|`Mdȵ-Wߢ}VH*{]q bAUc*'C*(ɨL^ѽͯWi[gu&k?^ηؕi+_[i9َZ!|~M2-,b!Zy;3uj2#⥾>+ iyUBj. _ʇ)ó8ep)&-h꧈X+.~onk= a/od0D|R SztB"fT (X`#R^3ԕc#&H(+V@|qНt+T jV-Y@1Ֆ)+ܗ\t3]=+<(jB=*RzkU>xpf،δB3TRAm'ոB(TjU/* WjST)ai+|4~4L>SㅛtOn@ }H-~YߺoW^|Jj鯄EbkU(Bn9uށ[֨#N84E3^2##<>; ZInVToepRKW*tnEO.^\!x)F)JvmdjO_JjKTO/DOO ` ~ l* nxXW OKTj'C3 97" i^ԿFJCMZ:wAoU JmQ%.KԋI}{9̵>w\H&"պ}Nޘ]A0:܆?y \+ =%`|`+2Ub*PuSx9U,bH-.ۺM6V;x/M9ٯ*5)uR+jQ2Rb3'g0}ֹSʨhV^=hLN Ft|-GHݽ'/);7:_0*>1dr \qa)|P 5`d>I-$%F`ٓ Ikd.D PJٚ(7=P0 F8DuE00NXVa蠿U5#}uoǡbfjQk\I`AUOE5փARO00jo-i4z@i]]Gӛ=$Q$7]|$d!V1]dMw p`pXVKAլ6n Cu"4F>`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*{ BJ4n:{4W{g^P˗S -Հ$BK=.Z]˞ 9Ko NŴ'[$(v`W4 IEь+3_yޒ`"oNƺUc]bEEZR2 ]&ֽ=\d^ AN'Hy FtEcZVhBq^V[V>Sg+XE Bv@8 qpX_Ū=c:Nfp!%%}9IbwV+We[&z'[eYrO4XV2Uʠ`eQMΒ=_Sʨ2}My㼗CO{jrr@eT`i^RT͖Q5r{%pVU*o:\E7' 2{/'C󘫈^Wۉ^ GBbIyBJ4!*iŚO<kpeS*E4S0sWHg g .Kx},ൎel7$N-GP2r k{·{|@* En-S5%KF pB&+:@:*`*@$D|"c@0($cTLQ]99C`: &XrI"RB&EKNO6yg~C09~p !4 ۣ{Ha]ardGh@ReJM)o(Zn8 $\$7Knm]6gP)ىy+z˃`yBI$,Q:"f{0q9/G B`͍a(7h=\?XpGIee"5~#S)a^#b>PJ*Ȫ$@p(%J>^99u0݃pJ$xLb`S*3 #BOoZ&#dHGPZPF$sp>S'RJ#( |/ -EtZ*aJ3aޣ=9{TZ:#GS42_us@#fu(~~K6}J ~9tz6͑?# /0Ox@hbv;D$!  IJ(bzRP6($:V'q>2wSKpJEE41QMb_bqjђ _,Zn| x@n AF{Xclxցpl%>N9<XT=tOc|Ϙp:BAR  :R rdlݽ9 >-tp.:,Ut,c=}\Kw!/+3Nhiup^KD\^o{y vy2f?s ! P Y -N$(dO%!b~IIeM(X`_'ϋP8 0jLmiF« fQB&%$lHGdÐD͆Maꁡ 矔8QTt*b-(Cz-/d6 iv q4fS;`f!tXO56Z)h% %`ORd3`br$[N)uuT>|ɜVd\ks R&Z 9ܩ;r.q蝊_.^P})ӣb>) A)NT@({1G?]LDH<@;YLP˜~ϧl-5}ˣY WFC,P,Kr?!D$F=8h$6@ԖZHcu=}\srEn9蒄T 9*t^K@3zhAS#tjR̅$SA j_ۃQ^Fe:%`6%@eTR:6Yf|+_ʠdU%h\o[3v`yW!cJw5 w9< ?=c2^OXNC]=\MqLt$ppeԔq^FupōK:ZLsVlj&ސ=ϣ+䙤^ځQIe#r/=n47xpHU\b˶hmrõ覕 %ʨ#;ãloB)ebPeLil*c֭ B~(סz@VB{+w;BɏʊÕQَ;{4V0P+v kynÕQkV҉bz2tu(+}*Cdu`ePR^QʩXX{*1SU%pEml=SFp0<\U [ &+ y5Uʠ}Oԃ6S(kа5n+:t,ӞÕQŮxS偊]Yꤦ}:ÕQfZxK35[k 2޷EyVPtڢۃiWmy݃`bsB1vFl-=*N9짵8|_ cr8wxK(DP'ٷh6V.I^):.YLTOGR4 blڻ>b9&ͭh5|,4! K*q*%)U${Ɨǹ^H&s4Ogj6K5P<bO+&x8XUL pG#F)2wGɡ0:E9nbonbTE&0>EGL:[H,?㌉o8¨|-e{~EggkFYCQGq/ />뚤i ol`AnV'M W3Udv|^4A| 8J %Fsil`Xgĝ^x;W޼0FVFSF;)p[M΄U?{N E%ِq\HΝhP IOƎ ÜX5.4JA&Hlcj Q 'yY$3֤` !Sc?}ߏcb\.]BQJ n&<Gv=CۜKY&s*AІ!ȻsQYvPʌ@gsn$3f>FM%?nsVo-Ml :dY.4eyI [H &ջ,ٝ ˘}Q8vg16Qrl %'VAmLDF IL2s@2 ddJν_XBϺ.wƎ3Iܛ,4:[$-0Y8Dj*|[;SN v2ys7 Ý> stream x]0 E|dh]$cAZo 1 +] ncnD`w ȭi-jECXr,R[t MS MGuԩ O+<"3 endstream endobj 2549 0 obj << /Type /ObjStm /N 100 /First 979 /Length 2095 /Filter /FlateDecode >> stream xZo7~_&p!Y A^<85r\}CYVj/$.9".g| o$CY;"6a/hFX{T{:=9K>.*#)h-XCA[ѐOu Wa4- l(rrh+$^hUX%Kb'ӵ}7ᓝ>̈D]wtYEfr}qԢqhU䄖"c]`8 $.0%raؕT L &0׾l1]љ)k1F]p0AJJ"t*4V(HT3~Lc=Ī#l@dl % @xL-;-%,(X:pFWUsqX $QAe:7R(_VKMd-$8S` M(f;µũD؂׳igݣx jj3)%U r\g s!EMd tkCKxynN`4Wh` *jn>5`y1Kr>,?a(,pxOMe^|`C>DZalzӼy~dw헹ߟ[ N V{5V_uO}g/D;`U֧l. LԻՍ,ʁUĒUprXS܊>0C~ ~?]`ReReR`z*VuڸBߜ3Ksz~}6<7:y fbztޚGϿz~w}W}$KFG]ן۫c۞8=ǏǗ98Oo^Zÿ۳ ^\QHۍvQ;gy{a^_^\9iMgB7l^4?({E:AE+18`QV 8oMs<}750G/~6ZNU1TFˎȑWFz8 By%!@ՓX%xH:[q;*.kf [:6[;o[c; r q2@r][r؊k̄-~HaD ΎC*G€~7'S7MI9XFCZBFp@ܾQ.X5_(M|YIBt;QF9lB?áD|w ,~3tf⚜BZH ɢ`KG1X'$;sU(u Wv|p-ICNLs{.[8L`H.ލEv}w#4RezP) >%x𱔾ՏXc[^xPma9TzkK]B`v@w]ٍ^k^fU]9k7TC`lJe?dG-vn&_!ġ2&(!:x6ES!>jR *E !G٠Jp0zޥ'Z``Uyܳ@%z!Ujʇ]h}Rx9q:\}yVIB8e?liRc:{MuI` -6*U3J2$1⦾>6ʘ%9_Py)c^g;WUB 0MS)RPoκ [._cOgʴ%CpX5hz RMW endstream endobj 2677 0 obj << /Length 2621 /Filter /FlateDecode >> stream xZKs7W𶣲QYoJ9U>lvUȚ]RH*}pn>&rȉC|i'^_{39v΄]a[/J^~ЩuUjzQ-եvm:|jS!&}ٖjϺWl[?$jmoӋa}Z/l\,U: B:μ &x nZ`&Sp05WpʞfR~r*+>,kOVw[9&]oT0H#̞/ن0PfK wJN:se kXphLJ)S3r)~,s,7O6=QXx|<ްwy@䴳kδYb@d}9{L=Bw@\C;_R=Q$O/?zR vs>5?5/Nx'\KGX4(az!f!Qd,ri7)hu8l[َ%yn%Eֲg 5jKQ ȩI`23:q[ku ]?΢ܮ_x]ӢWN 9tέ88H [inT5Wɼp@ `,j~k%s% K# !_BoV9dO)z]U ʪnZ-6)L3s fdvȡQ ?3zz8pU'ɪyhU!vZ$`O$RpzF Q6,g.{B&d]ue56@.Ƅ.@ߛNq %FTu bLA*fNFW`Hrq( Ұ=E!\ɡ0T8~2nGyIR0$y!GHKhJ4S4&- DP)@WD%OTKcyiR]'@9$@i(<9;La0ڍє|LM^y#G;: Llc|QK˵0jNxg6\kMLM T]ySFX8J/N|Tu#|W7Ovu#ώD([ 㕟6dȤ:DX;s#U5-*D[VM!ͻ;f%i1piA˟HZc{12 Pdt2XPr`{{F-> ׫-Qg=Um&LIgQ[ q 1j刐.: 76愉t=qЊ)B;)T K;(إ3;m(y{+χU{e;sj*UXKcrQf rb/g}(s FV1 78ˀ/9(\ ggp`N*c  =Fث 1pIn b0'.9'1'> sw\P]޺siR%y1DAc}B j3ʀ 'Y.ӛ)]sˬvgbogShE->?O/fe<-(՛4![s؊Ơ/J>,2p tn.tnx$񝍔 2a iڵE[{JWQWL?y9iR!9OEUW8l.pkBU) 4^9 J%{V6Q˨*#E`W&N,tGAfhڡw̺0P9U-2Ho?|ծToFx˳C29YIDMĴ ~J 9]J=RD[Nwx4tزgAoؼţ}9kDd.S]poY8W endstream endobj 2684 0 obj << /Length 2725 /Filter /FlateDecode >> stream xZY6~_G2BpCvw8ɦ&U(3õmHty5_$l6~DAF: (er0og øMG@Jp`W2h8R&/^r|~oזB`C,QuD5bO=#{z ,(,󼼳-jT5IqV'WP$^]cgRV-ǵ-Q2}zjW=M糲SGG\;gU?xAor 3y^7yh7v_,l ET6X?8e8u ϝR!X2"d"Az?+އ JYLAzVmeVL(Q+ UiG.&tbRV4!6k~,Ni |])/Ηr+U^zZό%DE>gvt2$ >|/1B WE>?- 0(1IVX}=mӚs_W4/wx0DqkONFyQ( S hAiEs : ]N@j/Y.[6G,u4cbdUP*y+4;`t vtrkL™-yĬ(m/Gbw;gBK/u(\&iK?rL9S~$~T~Dx"jsUaPۺ{Q,nmjpm+*_闳* [@pۧ: \g* Vx\dXmco|i¾)eǢ%7+7oVE"xt.p-6;B<{\Mc`̀Řydd zkjDzN[.IAP#xjUʞeikP># } ~K߱[`3{K GR&l[:On(\Fh8gpibܽ^6awn@v~;X@KK>Alk8כ4 ¥e-I9dQ丽)s)hUxتحi<.m lQgἁ5o} ݷz.b(sꃘ.S`в_"3Rvk;6'3㧍GvGf<ǃnciJN/[3C؛Dd!;;C2gCv~׎G GD/\Bv ٟN'{Hl|Ȳb&=¶8TFO:btm8"RoLSx13אI8ȡ^p<>ܿ{?-,}cϳ]î.uλ^ZLvN)T]CÝPv<,\o`F!MDw[>Įjz8䆲Aw/kΉpNy Z8jd wsȘasY qȿL7>{zi Ī.y`?~w$́#[w/̫@Vȝ}Z,E:]a4r' {jq}aR #طCECQ&c9ۓMVHڛÓY~,@sP})?r/GYUJTG~Zu?WP;o ]/  endstream endobj 2699 0 obj << /Length 2376 /Filter /FlateDecode >> stream x[nF}WyR5kA,@6(Z%rKfbnsK8чo}U1Ҝ6 U$B:>0矮<}{##klmQ2$Vshƚ͈FBbdY:IdEjpSID)+E`DZVB8#A"N=&O!d$5XeFc6VytR'8 M$c*`]&7U-3Vd啓 fIݛl^d^]JJ^t.Qv0W. 2&!rZx=Y5?C@Va෻񢘪Wǝ< [JֻKAܤ aE 2-xZyҲ1`$!3Bf ]R(O.9ЃT\S0URG3Iy9/]467ciA]4)#m"yȸ[$1o:.z+M0C߲ !FyjO9ǐ#ٛ(GmTw#~*vĻّpHu#HnzD}H9zD#S$vgÏ~=1l`$LEIt.e%Y6W)iD !R%!VNѽ"P @n`I6^v(Q`6H_> JSuM5m׎$ک0rOl6 ~n}oxʟO_j O pSEx8=* ~p_b/Rbx[]ڍuեW]yu)W=q.}PѱKm{Gq {8U-K[YzB0}+K,ҿ6[YzmfY}bNdm>6/rn"*?>Fà4|9JEqe}L"gM"LM0yN_d ͏<>j@!w fYL&8$a0$m.*hp;İ&N4'Miž`1DZH( ҙ|pVެi_Y"4ױܮ{3`fB]bn!y g0f|YNZ{ Tr i|)kWK~9AvhEs`yn,ƐSls^R9YJ3X@ je|,ц C(UN+v0m[Iɘ 6(rtgs>QRj^8ik;.|r g)  nXINףcvfAS&xd&ǂXz~M GQ,!9ZTaYvjz_\\8k\ċ|q~C:dܽǿ̓r'{(i VP/TSz-˵eVP-Rt,NɱE*0΄8M` >kw㴉]a>޽3, 6sܻlrbmc%l $aokHvGRp?Տk!.r U^ }.pБ٪0 ŎG:Ɠe~R`h endstream endobj 2709 0 obj << /Length 3059 /Filter /FlateDecode >> stream xks'xK'c#st(R^H<DJJ*c{wշ1FbxogxĖp{IS_e8n1J09۟~<ב&G}yÁ6yqi{EwV%1/FsKKߜTC7Y&$K*:Kͱ6N3XswjzoAF F11v7ol4IOFWgǗ* u 3k! ~xҥLd=G˯GVFxӑ v6Zz}ZAC%5g-Nܤs1..q(h&Z.XF_āx'CɿHI,a6-}uEvG2ǷġX,r4[rjGTl|YfEd/ Zhy7yM)q\FM#}XlRȃ_R?*:ή.y78v OW\),[¥g\w6e9Cr4N\3]xg)3TH ZX\@0eϐH WHЈ~ /na=fb4]ӫi_Yz5/lސ! Ue͆P F]%1x D'&6&7Q.leN lr-&#G Dbz#&ûThp::b2@DKTI]g|Vuʚ(yb+Cd&h-YUM/iWگw{'Mf6?B=oΓ;syLgg~^^z47{udZ%P1/%OIB@&ծLk0VQ7:理DXVLvcކɱ1Ly< wa.ocsĦ6^$f&5梔Z1I 3[ԙ]Cv s!I!LpKYŪ%ʑ(٧ mE5 Fnv~$8eI-)7XR Q Т<$D\ nte "ýl2\S[UgMΚsV%4إE?RmgVJLN2TZVDnB3_ݒ l&M?as2(gYJ`ϓ@wђe|we<϶m,pF8gl%!(>%d˺o.>0qyw=\זrv#Rl5mLbO>S7ŎCefm_rF3(Js*2$wG$FmPfF>)k*Se+6ual8Jؼ:XD^YVXWɏ U(}TA*bB(p,b&W<{I0 -ﭺ2mZ&&>Tztov7iB- >wܧO^ x%>`~O7J|odQ?G um16HbM%&O1:)f-7e#Ms4K/^Xs>(3dDrݽ|ɦ_@i}2$u"^b"W`4'ʤ^!oCC c-m-*U"bڒFAJ<ɞpW Lrj6 Ö(~n*=W~cUQh;T 0~h\#J^PCFl28 TTM_ ˅V ?[AŸBTdϿ )W!ksXv 2j/%ЍU+p\uz*mi}UiVTl5Gc0etx.%yCzM[nvH'iRE䶌o\-VDEA8Ͷc^eC} .WY n6V k7Qk`oqA%߭NpxQޔjֿSzk58kN':6;8.?h#CȐ*t^waDo,,x$B*WN=rQ }G%lv]ζ_cry_r ^|)D[Om.qq8 `NAm .?ٹýEa;{( Ea% {_ ^Gž*y V7b90c& endstream endobj 2720 0 obj << /Length 3285 /Filter /FlateDecode >> stream x\s6BODL>98c$:dƖJNx(Hm%m:X߾觓GO BP.\#d28JD^$eoS'~=8x(~y(苽T: ba\P(91esՈqO/1>R9m& <-$0sg+1Q. Dh}Hf$~IgE+9Z5L=>(.?G͢xJt+s1l4Vj6(2DLJ Fl!G( wS]G]ͳQ]M+3 # \0$xicBBA ( W^&hxZ%%ykUDʁB–B e)UH#`T "X3.;<җDLAP~vd\GZBFbA IU]lXp1szf~.G <,uڌ-!Ս={"5hpb?2 ۓ#ǢBEOK2H1Klh;eaO Usx^ُٵ}4׳i1\t46P$(03{p,nyuipV%#-E]''*j1\qDXZ;`%(dK [.:n3,1JДХ6$~{#sM$pzeXo~+hp!sXEF \c<&!( {\cs+y+X4 ?ru-rZ`0!" Nm㔻8Ai*B5/eQ'#vS/BoV :xk24y'$w=X"4v:Y㥵;<ݸB|鬾l2eϲlúrʉυD32ܷYhί{R,FU66PD!85oAc<|3/tϋh\&FTkq/RHYJEH1OmOW.VI_e6Z}ɶ7r'nwC> a" |z#_5,G.[D p(M$bR'֧AfqC?074onBM:e`i7 Lq[*:6HX5Sh7S7qҊYj2Rӱ܈A,網IZ6Hp+iiCңtXs@D$*!7#F" ,֛<_7N∘9P655ISy3i'RԘanB)ح!"";e15&4%-Q FONu=jzT_ *x LeMqM@+_L͹)M/nu{2l"*tBuQ?L"tV{Le'-%oq|(nil[pz'' ʵ#&с=l[k(fev}1(FPyWMx5~i!`$w qFO@@1ǣQI>8UK4ULto ˿;?*9h.bŹtƵ9>_6͙wCCҧYDݩ- w:QɺBTT̴?['1xQch6D6YC[\7=O>\qXNOv HMZ"ۗH/lU SrU䵶QXw o3#2{>F Nh»Opі+X [PHx_:r].50ړ\Uɧ4ű8}sS-!~ Wo*o;W5~̭M;yw$lŻzt55ijme7i@qw} ;0{ș._籠KY҂"Ay,i`TX!_V6&"9LYh7䬚.ZD DCZ>ZT##K÷#6ctCV&pR6gMΟoZ "8$΍\z[DۈJQPTot E"Q|<@V endstream endobj 2730 0 obj << /Length 3159 /Filter /FlateDecode >> stream xr8QX ak$*N<>mrFRoA rr(!Ѹ1 i5O2$;3&$CEO5JX$RIVa HVt2q^h]|YEy>"X{]x&$WU69K=c1ԁ beFDa/PLْ~ 9*sl ".{c_}\l逘}LrU4ÍB$=ByqY ÞC ~ +8sMdu5M/ΎjAWKETGe8F5ӓC̓am@>c#6iJh|//.}/B' 2ky" 2dX2\ىyҽID[?lT»?пq]Ͼ>2 ˼ MCn>Kim<^4zmq;QU%H3$&\8zy-Q1/(f%&e&[zwH(Ʈٯ=t_x)zxP]oXbBT<Ht:e[GHoz>2gf̀2E0 E`U^8=^2@>-V%v,WV뒵&2NV[U^'^ȰHEp/peŻSDźLtYu<PToٹoh' mO ;U{y]9zL'.M6J"'G_IB?ęx}\뿯 ~s=^^t[J\@, >/J>&&_T9o-<ͽ$O@KuyakUjh $ g+]MCaąm&MWs&r0|d>ہE6M=`NO=,$m^zحsۙ8ϋ2tgpW^&y<!{]2_Tzܪ`v0~=GCCR}t#AW)\7ki'rEVK $D>q0t;u8P+*+Jn(Rn6'k= endstream endobj 2741 0 obj << /Length 2458 /Filter /FlateDecode >> stream xZKoWpI!dޏ^A m@#Q[[r$9̃PRcg;gޝgr`43E3e4LfY%XIx;*ۏ޿833{/g;8<:\`D]ݢD0+u"9 2J+=T#ƃ&ix M{;gާ R52,EE.Cai)kO/鲼<$obyQc d6&Q  w`3vQBd7 +F$ ?Wp]֫xU9b}^ݼx1fWZͪ)ܣrv"# Q"ˆz~8P\ܪXղږ첼*6o]ۼhj&wVeX@e1V#HI^L D5(yq ژ],bQ֫e,ɜdpr-D/2 ;0L p&$R,Fz }hVl\v~n2HB~5dR#tHJ+Ug&Ez>>ku%E\ڦꇍY>0+DU.MnfJB| إ:*0*?2)#sT`h-$:2]}ƌ3$0jN'^}0bt۵gV!vHRzgwb<ԉ;1L#sOW?\3n7$`'aq;1d}b-",o7&&Ѓqm1{\oiI%&ͥ\BW&L'F/ƸbBf d R7Xj+e"a /40* # ܉xׯgI,7i*(Fon``<9^͙†e)cZ>Oq9EJ/")>Ao7WlRmuEa^'wgG8wA'"Nb^uה HiL#iځ"jXfML}rpA2mDJj!crJک1Pa, G`هzε`W_2 ։^e #m2]fO~ .0 )2dBfi WHdqrvy 1K5}18B8Pʂ>nQŸ#꜅c <^(Jݯy$!$Kw5#eS-ИD^*Ӭ JC?bU6}6{,DwuUdcw9?uaO5vÈ}A!X~͋m4kG':7 J x XW3jߗ<^Ɠ?э| #DJӺ0m""yO>x|P@?HP{`9 ,dweb ^:Qu8` sѭ~/}eҼƋ^]r>>T3;U״u(+EH,1OhʁI2_,xvDV& *xv:QMBWcL&;~A.O\4@d@pߟ::l[|њ?gVVۅk>7T1@l"Ɗ4vf7҂6iFbe!Su/IO74h x"$y5$ݝ,5ҏCv)Kr NTWחi5 2L@E6@XO\*wVwV-mQF*Kʻ <1 Rdh;gÅStЄ}lv:i  fܤ Se9=#~t#FF0cǶ5 *eѝ>UONAl4ޡ1,v;`q]S =5փ҅w>0'!\軻6ax\1|"ù^pr(D{dj<Ƭ}H<7 endstream endobj 2737 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 506.999 217.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2744 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaP2 endstream endobj 2736 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/P1P2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2745 0 R /BBox [0 0 507 218] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2746 0 R >>/Font << /R14 2747 0 R/R8 2748 0 R/R12 2749 0 R/R10 2750 0 R/R18 2751 0 R/R16 2752 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][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 2766 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 2767 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 2768 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 2769 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 xY[o6~УM,yxoч]Zd1 X$r춱[mC)%q=b>:I]f4䘙1bl04d\e쟜Iw(@K@6/t28z/8\~/^8zuz1 ɱRӢZ!\^> ɲ , @UKտƧT MN{x`TFsIRQ'-eoY憚gBQjyEINk(6K\81}& c:>5\b1FQ@ar9. IEu)L*&aDȑ'Aib5e).jH֞*) 4jD(kt'S:P@\ oS0;("74ffar_<-` PH1]&Lĺc3}P[hCg*kCM)RP $fnu['@VDd r RuvD+ " Nu{X2%V`!$Vb=|/ߕlU<[o=b2N1_*N Bl rZ]A[o:5gTL*$U;v0K@uv]kadMfhcA>Cp4;IYUίzzDp`"z~ _<9B]5ĸcZ 4y^֣ <F|7\W[ÎE@6Q[(-Syg&71kuU#.Xy'5-r*1WpVqfDxMf:.o}IYPpcfX8%TY !ӞHvE*}VsonZ{c_br,Cu TWXL>b֛nW'l;VڭmȪ Vl,B{l XMxY 'ײ ׈G,%x ަ#[[F"ΕΗn'aWa/ߥa>xS?L*m>7INJv5% hjLY6OY}J)3~uZ$Q]Xz%lu#rDq|,e J4"'D"^lہva|Gf*S(n sV4)ebZ^g?;cq݅luF͹,2UŤ@bX:\yi?{ q[pp[COQjjD> ӽ D֭ K3gcZ+v0 TT<)Mjv,>V:pzu"Oy=bkb`m5tz&rg蜅rk> stream x+2T0B˥kaP9 endstream endobj 2774 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/P0P1P2P1nc.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2790 0 R /BBox [0 0 341 328] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2791 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 2777 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 292.999 240.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2792 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaP@ endstream endobj 2776 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/projP0.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2793 0 R /BBox [0 0 293 241] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 2794 0 R >>/XObject << /R8 2795 0 R >>>> /Length 69 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`didg6213Q03P532L!-\~ endstream endobj 2795 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 2802 0 obj << /Length 2388 /Filter /FlateDecode >> stream xZYoF~ׯq`aCb7Fz`+#533U&٤z+@buu_Un2>ыSFiqJ|g :;>H2*f;6*7۳=;?9{u~OG ژT0ea͚%S hc 9G8gѯGD0](} ;HE U if+n]+ݦ-U[ =\2r%oU׋S23%C!,$ψ2uQa@ -WdW|$Y9/#n (q1LK,ߗrZ{?p|r3fWBR_20Wρ©,g%ܽ[W墀'~SB-}cT/^l:r]FqgL%fZzO]mC|908pŽ:0&4Ă{1bD6fgE)j- TSVъ8A ,E""Ch]L9 =D*LQWզl\7 ! BanB]W}AhAaq7n~`K U!!dzܚJ l$Eli Ȇˇ}Ce,^*=>RQ0  7Xx\tɲ6 ]Md4Ŗix=I"B&㷿A@EJ*Xi?lrmCA[΄ XS)ڳ:lS/(#CmJ$Nms1Kx 6ӱvi]olH%ucAH::n%#?Ɖj@ws_8}Zh_3f^]Exemٚ"XҡPxHPUr@KO%#4.Ncu @j)\fjE}ۤud;dpvבYA@C LZ\xD2`6/!w4#CY}8D*"u K=K zWAvڝ4St; Baz:8RE.!w ӵfc\"˃Dii|FmEyHSkʴ!f:N0k֗>d "9J\_h$;[ºPh[wci&,;b *S32&h'ivJq@m 쎮 %m}\[{EJh>QDb6u|ξWus,"<ؾ%=)0YD'?fQTCX @$+Cqd֗diGS-s1;<wo~g̾jc-NoBNE1sMKw"j%2MF{B%x77WwfD4pu`RGpS6KY;t=jY@W,/ 0:GYxc6Sbԭq;{2kʼ\o´75 65jB`$MY V#Z#72pd_i@" ɂD5ӆ_!)&: A6 jxvb.(z^O?}L2`deԨ;k.ڴELJDuKlEf{3B +#yyv:cz{:aEV 1&CN>=oQfTN-ᓿ4ܦwk"綟d9^bUk;Q S^$ 6 P(aӑyۜ{YͪE9^5i$ Ak<zgmkMiz<4xFC܉?m&pOIkK6_v({8 \/BR;Z ! St=FOM1~+$A"DHv $+Ծ\`V]탫AT>8fYicP?8[OGO:H2=S~`gЏN]Kt%I?zFm?$Z endstream endobj 2679 0 obj << /Type /ObjStm /N 100 /First 983 /Length 2624 /Filter /FlateDecode >> stream xZkoF_1ߚEP@~ֻqn0 UflvmIdܑdD2@ΐs3gD`MuB{*i&iijX&LQagC 8d()t2C ""Jul")S wƠ^ TC*!qi=Ր9! F"Ԉ@& "/*ʠx ӸS>JO%;tl jаъFSyrY0D}21A(4(%ѣ SȅaOP1M;p|S y}gGOٵ4cx wXvɲՐeM7c20O]}dٯ}f n6ip*2>%AT4PBjPpvjIJ~vHh]\A/tk~K^,="ŧ%cPdl7&deS]j&U@w%M&=s8 '$4n=ywO[nٳ[Qs :s ` 68z9,WXtK b#8To'A^xDzkLj1)7XkZ9cאˆ&`q|7-J˽mJ$nkhU\bip^7Xi}Bd,X͂DݬәE$N8К+ 7`k]eY֮u&U~+YEβ!.ƭ,`m4~uN9nlbz[RCĪ`HkZQW7Ҭ4 VoruU}GҎKa&aޑmxbBFfMKFƜC{Eh()nJ7S>5Ҷִ!/0u+9kJ2|?ZYyZ[/P\^9ie͋آ:۱~:^~^Ls>)յ_tmY6.rLh~1vus#}kmEBȩk5[y/ڶ~\ f۰Yه5LW3]}n6,܂J?4Xk@9\u*b'dܞj{4,SL2+ҶݚFPǝy8,Q vQe"ۧ~>fo>ggt)vppܛJHl甑zkFo`w1m2*0ɑhp>D?ލ{_ٸ7/v2+2'ӳ)u?\0xz؛n٧}^\~8| fd>.|1Єt i-tubouت=CFNRJjqn-4 ["]N%t,:fg^ෂRP,MG E5yy4 rG%a7(}+ LX!c ]"].heZ8U%oE,x5JsM%~Q2R/ ǟ=]۴eӶUie+:1rԽ#l\w|ыݳ8ǃG{Civ3c5tCg"4qg5ӗ5).4`qtྡྷ[߈ %Cż0lFfC5*%xfX}p5vSqGآrQ: 1͚3cey8}4 ϐG ɮ'~qâ/O|zq:EEÜ.u[C]sCxH̦~Fݳ4 5?/I"}`1 ^GEz?&gx@Px@Oü`W򃨒4+H4'k*v4CҺ7$}Q6 y{.M/[9}(yoѤEnZ 'q!qI + endstream endobj 2781 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 559.999 454.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2806 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaPG endstream endobj 2780 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/projP1.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2807 0 R /BBox [0 0 560 455] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 2808 0 R >>/XObject << /R8 2809 0 R >>>> /Length 71 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`jjigl715133Q5352000Wq ̌ :,\ endstream endobj 2809 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 2783 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 543.999 503.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2811 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaPN endstream endobj 2782 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/projP2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2812 0 R /BBox [0 0 544 504] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 2813 0 R >>/XObject << /R8 2814 0 R >>>> /Length 68 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`jblga7503-@PB%+E endstream endobj 2814 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 xZYsG~ׯǥbsr*8>(W*- (}zfg吐@="oG?w4 2E3e4LfCNl}1C9R'?mD4?={u9)?;yyɫ;קg# Tb71Ma(z8Lgo 5P(WuRPD"M%7og"*)RX {h^~6$ΏyS2 Md*plB؞R;9O J+&aE8+/r!piB!mV "0@", #,IBSш\(C14%C"#e[[V~ RIܤCCez9q>Jf4'ޚ~3"FpoQH>/y|:KF 14 .e1-t_%l^8~WX OG܂[#vߕo̦ #E YiȈdHF ұ#8y5<|{jX3VDB`>Rs"hҴSH }RPW&&xxA=[n<*rCF[\К> /]d囷,=mU,F>]fv~$% 0N"/gy>x},~:UyP|P'G:7\&K{KW'#wqcY}u_U^uz*ݕLYORu(EzFy5+nAZ:wm!z f- ^I_w6xq$_Z oU1 \evzQΡճiilc-j!`۟2OO/~a!- q[Q)b6N.ɮAC:IR̔Jo4U9R"a VsnҡNhX4`&RގdHdYHLD%/X{VJ~4[>~.e_rCOXK86Ѥ@ɕ lMY'g%\kqFޮ9F8xBB,xL5H(<p܏krsa^Ѓ]Ц>؁Ӊj8lA`߯ ML9vTmɩ݄M?w0a?ݻI=eCډ2; 8=z\O|eX<( MF<3EV:U :ʎ:4.h3NSDHS_xp-$ $}VkCjې=XN *I8ٯ L~Kc~5)ɞB7} {A+ nf7}?-f {4Sh ?;aͅnʝQ鏦e){~H_GhƻDAr@ urh g C,k'z Kum-gޔho ЉH 07H*ID |1/A׳Ѣq4ؒ[NRv[-voS!t E| ?Θ9n L4 - C ߎojQ8UpS7QA˘Q`ORSZP鄉>6DBe$J2N"eJA[ SCYduƧɻd( pn+E&tWl >#j`7؎װ"_JiK[Ѣ!D\)FJQ#L-A$)ٕAWm0%`-AfW~e?/cy7 v$9eе~ˇח7] <ƋIG.&$ endstream endobj 2819 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 512.999 585.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2834 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaPU endstream endobj 2818 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/projP1nc.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2835 0 R /BBox [0 0 513 586] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 2836 0 R >>/XObject << /R8 2837 0 R >>>> /Length 72 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`jhlgn70330Q5ֳ4200j05205Pp Bl endstream endobj 2837 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 2821 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 504.999 443.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2838 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kaP\ endstream endobj 2820 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/projP1b.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2839 0 R /BBox [0 0 505 444] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 2840 0 R >>/XObject << /R8 2841 0 R >>>> /Length 69 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`j`b 411132Q53000R035205Pp Bk endstream endobj 2841 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[Ys~@0JJleˇB˩$L2Oϱ34+vRy!3=}~=Ӌ' |yW !A'׋e4LN瓷S$)Io.gdK2Q6ӿ/ 9z5ϯw_: 0e.p%[YE?1p`azͦq~rZݗs[nm=COFbg04G?0.gTb7EV'|QS ̄'9JNfqP$9m'67hL>HL  USGȀKSbwwV#V[kD]ҭt(>e fQę#a dBD B BlZ҈c+ KOu+ RzI I6:܏ʶYʮS d|Nb@5r،|6T/ jJ!#lcxL8MycO",cVNQV&yA ;F i#̄&L9?0h! wi6!D?T bWVș:]D-eJXuy=^9 XuaCu?ήWMqѹ+7>ٱ /W[Ep ߮Nb]2Q444u+uD8QF(RUu5Kyܗzpg(eKjq 2(nC.Ѱn\hg67ݢ‘j<&Uݔ3ap~⇋ J3"1ff\?+6C+`̙Ed?_ZKnV0d9<^&wT+p+JL@ e!i@*wz.3h"v´63ABḣ&NU$&ɡ^n)ue-syx MH|4.JM*[כw2ln1hV˦7ܲ" upb'ᶫavC@ھ,qek;7}Z[VlI+4pp^UbB|psJ}^><95I|_pWm8ۭ𬚗L7.d)UMY G'aa=/Vq!b˚-`-&_rRq\W.CZNR{wH2 nifUwMqè!j΂30h?/ct"<퍽[6h0:?8yoT!A5X%&qP=!RFHjghv٥^yحCӪ$t`t)(1Qs&chu2Y3a .vl7u$P/ <6\3j$>:"#pVMbaa";[,sw5AxPj ÙID> [s $9JY٫? "m:47L֐yK)P5%(uhԉ mÈ=2=.^  7šLU0 ], 3=1T >LrTHFwQv|JC (-k2VrW^pC(q +(IOn7oB8H7@7voO&d 4}{OŒẁ39Gqo"儸*Ga>J}T&@ifnTrL;Tlenq8@B@ÊKaNN}Y%cB9 `ZMˁ&jZ# 5cҩV7kbi7J]v.ToVY=[ջokDc{&nN[֯0 HAa>-341Y$> x3bw|s<.UgD:0\7zBNxK$.ߪF)8=Iڱnil(ohI M,Hu ZFվM4սb{R̚,=U 1X%vً9w@>l rtLZx \EZh$]PA`2 I5NNkxN8pbiIf\wF Hk4űLJt6D3C1Я ʀ$i2VcctmQ qד+5n I"ﳄ:։FMG׆H XbI}: 0QFyyB= RDx>sY(?la@/mfb}; 밢V]5s=0-۪/fw|K\4(-qqBΌp(:~xo_VTm2-MG.U'Zc.;/Wrt6Yh#@Ӟ 35NȢg igN: 6R!@}$FAyS%/)#(V1R}T-N`62N“B2HA:'rDN -FZ-X>(ge(#wtOQ˝(p{~I`O7Fr0Grh؊Ɍ3q"Z G1^c-nI7"w{۾^e-˴;KC,o頺 $6zưpѥ{Tn<ڀHAdUϢCN;#]]39L+Ng2={9-[t~͗eH"j~ endstream endobj 2843 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 199.999 220.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2854 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kiP% endstream endobj 2842 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/RT0.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2855 0 R /BBox [0 0 200 221] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 2856 0 R >>/Font << /R10 2857 0 R/R8 2858 0 R/R12 2859 0 R/R16 2860 0 R/R14 2861 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 2872 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 2873 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 2874 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 2876 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 2885 0 obj << /Length 1604 /Filter /FlateDecode >> stream xXmFί X} (MI)Q z 6wiUU)<;3>ϝ&!.8JLx0 >vϓWZ ² FL_3 ]zqw>:mzQց~>ǒ2@dmb5>B tJ 懙5Jdcnr */"QH,{"1%LX)ei8ᦵ w-P|m6"kz€<_' c=-]3@T.`O!@bCl8-E_iƂX(ų} "I$ɷX&"6؆Yu!)?ހC]l/I||JqߤqO8VKe˳?䱳Hg8 0ժ?]4$Y8?#;m,YyjV' ~~Ȇp)D34?slj~!2AgGkEJYXq7,ԏֹ%8|ORL]]1^r{QI 'v㖬7e`'7\nI:a*IٗyĎi3?Yj"(SB\;.,3O53çrȆsS|.o]2$ypczg؞ s9͡vɁ gM^%0bb \L!9>\"M=Gv߻xdzbg `}~rk~ (s;\Wy1c:B 1e#?5nlG6 PI4]?$8' sfV FV(Pm`O X!hD X#.oq"$:jGx(ih*] ]TOmYҙG/LӌȣġߪJNp+wVh)ne[s n%IcYQVVV׹]jRKLSgz/{t dׇ8?Wd7-{zdMǾɾv%̡i Y"2s\׈HUbٔ}onY(+D\c;s*}XձkRI3- mmh5@76j;kUwizI"\2;UZ܃QdGaPokA[M=[8aUhި'-wR 5R( Dz(#={T!2B!2d9u]ZCS;+my endstream endobj 2880 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 343.999 343.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2889 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kiP, endstream endobj 2879 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/onoldmesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2890 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2891 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 2882 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 343.999 343.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2892 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kiP3 endstream endobj 2881 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/onnewmesh.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2893 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2894 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'LvHLQgvAFI/" 4D' o7O]3J'L)>YMR>I3MH&7iBR2 O3F_n5^zj6gӛ^W?^k?rOofopL(aJÜ̐Le uӤ& `fj, K j2\]]].Ϯ%3uX qܼ}/ύ$f `B,DK}l6_n(>ź)Fu+Y;B ?Ƥ?%ۅ^N'P`5%iOC?m(I2L.Y$ɘ_Ƥz(JRqaG긻- X ZgQEgxnI* z7f!]X-ڲF+j<(,`.$QP A3u BfƲPGvz"ÃO*l鰘)6ͷycQ&uŶUk]ozЅP+`tۘ_?ozy;pn n8nvmS86T7;"W˨4Ό+TLg?2sR篴[J|J黧v8jblX;^xjX~OV`wui7%̇nol< ?S™~:+NOA/-?g6к WN3{\+x) &ۺqcsS3ln3679עofX(ξ,â)Zc3pۀ9*iŇy?@V_4 _,h tz)NBcl#. >[^ / b]q u bv9%YJ1I8< ͠M^Fp^8 .KA<6084Á1h8dXmn zZZw˷)& ty\} 4#[f+]3XDfK$Rf㗸1v/s$5/:&oMa;|6;\qV߈9Պ~ƨH~e) OLV~{_ >ξ@6'=Mq`>ll[mgQ4iS.sh VUʦqLҖ,A=ԛ f9Q3qVSGcΔV^Un" )( @`܂Iv x/v{.md@c&0~1:ԾSl)1{`} iIe(_yv su0g|LI'R]p,tz&)j}=6  K^V M){E. ?$6;6][Ex&3K1fHrʩ h3lPDzI)04qZ|;U\7\Bz|2d@bNxtCt~sO06.:ubEf+6z)'3SA1 S`OAt+t2Ѓ,4|@\A3"*%?M )lט>ntYuWv8%$0^fJ?)3X; +#ðm`cσ5Xʃce0u(ٔ"_M H}"I3 })5[!f`_T?tkWdgo6|o0dA. M…/t@%\}; )q@Mej{?1wV2%# MD#'F.&BHqw1A6.[ゆ6^ Et>J B E$ep3 JLBȱ+HiڊM~eL<)sdSۥϜI=[}p3D`b hQW~MSOx_+X$8gnI`Vb901?xZ4`= xn<`CǭՓN>5#mm aa&Y0qEaQHXrj/vjW,†yܺZfQGOa]ߍ.,9O],GruZy]z:@?$Dz1E1<>:Kl>lr2ڦ2Ƙ??YWXqEsko30gcx AL`Fl ċYXţ& ]ݼ564( hwP3:ڍ}uU*pߚܙLEhܧ%ʶE:̕NT]?|9Tw5)Ļ)(t%8$'8/`RpM*O`'R܀m5MC̥lrAEC 5B> stream xYo_GX3⧨=n/ݡho@-ۺRVSp(Yrqr]8 p8xų?_[^\^s;㜥Zr3K,I-̖ٿ"n?YDYqd]^4_Ha"Ĉ?,h/W>,?"/qʑIEwLHOj5^- S(YVe|L,S'ɔf:8ȇ %{ODa,ai{.^K-Fd!3Uhc!Y,y2sl:öfzHnCZ ̤Du36zDUTsUyPp4j0AglBgB05=_k(F0 $mnOt NeMvAB>'ۉ"s(! 鴂a0J&tN@>汯Dh$8W! hܐsuHd:DXUާ c!S_@^ICy귁)j&951͈5=3SDŽST5zbs /w~~sr]]Iu.\{ix]I{4@Ϲ"Szj ]Sߔ9 0^' q5Ego 1f:h0w92#lɣ}KH Z'A.E~{o:)>g!KdWq(XCcAU! "DT-"OvSGF! %CnH=g0w<ۻ)ڎB2!FDZǁ-Mh]}׏u;jeef`G/umeK{  :>YW V-X}`xٵ>ΡdC^ȼZutlS5S cwm^ kM 4=2ՑYE Bۆ`G˞GPJL,/\@h‡esAVs H?ӄS26*bYYjKSwnv/o=WrŊJ"*ͨ{ؑ.LAG VDJxv]D]^f*sS\DKk#-T, yU k4bӺioV> ~lT+SBM-PHL3s@ƞӠ_gMW\L%sxχud J'2*A4z;tp\It{Qmf߿["n}Wz#Y{W$Stv \?b| W_#Iyhc[yf&`/&#{`K+A>tzB\oF.J)!b]4">njp'ֿ_*Wa`KZeP#˚Yǐjh9{| U)`U\ g\*ڜ)oj99ZB%szwҡ&Q:ۮƥ$ae2dpIᎣpj>vu/*?Lh7PWᾖ@Uz؞r [:.8T ,d}VrjBAa>:yr  lٿr!/u9uqmjqXz:vŔ_' KS.+(w'G}z ȫLvꠃ5$Ks[综j0o2W`0Dd`cs1k$憘XA/яC?U@.BD>¿O:-`HoC_0a4 {]EjڎCB b+ jy_5 endstream endobj 2896 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 375.999 272.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2910 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kiP: endstream endobj 2895 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/fastInterpolat.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2911 0 R /BBox [0 0 376 273] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 2912 0 R >>/XObject << /R8 2913 0 R >>>> /Length 59 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`lnR027Qz@`h`aQg~ endstream endobj 2913 0 obj << /Subtype /Image /ColorSpace /DeviceRGB /Width 376 /Height 273 /BitsPerComponent 8 /Filter /DCTDecode /Length 25283 >> 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Ҩk-ş 1xg~M>3j[ {9R/ qog|hi~?_Ҟ+7_Xwc'?_4^ ^kM\&W1K[KxWDssz9F>:D/ʖT ??hZE-&*Hi&wu(Y(wDEguZ(x/^uZ⶝.l=>MjsgtO)UeD-:;OW ɤ5 zS.]kib6"]],(P@;|P#ᦸ~?Ze4+ ?f).eo|( ( ]oO i>r^ /7E42=67jj{L_LVVk\5B'ӮUݱ-oM"JtSwtP@P@pm5!wwjGH-iX;C:GZ7_/xkė6>0X^,u#j71nUړ^s2UTE #a\~Ni7 5f&eV)ms44MP ?h_<D[ij0E0FUcYww]p@?|}ã럳߂`[iˡNQɕa¶ܪ <1*_nkY闺γ{iϾp%f;WlP ~=? (D~ªҗĺVkYj^%[o"S FuSNڋ){?dMz}NQǟ%MwO[yG}u:lcα}1~;O:Os-s#i++yS-Q}LP@aV/M=:B%8Qv$QFj"qynOkֺ~k|l-鰋Z'_=ao$YNYet$*"Z|}@~ǿhkLOgKh^Vu&ܻy߷r&' Fm*緑>kSrV}u~z^_"f.^8-~q4DV![TEiӍicckqۜ嫓 z?d隝ύ~e:gX\)ٲw-(TG)M׿ƭF>>ҧ(b׮$wf]m vg:ι-fMņzVMv̷Wp(>ϵh^ ~C .LM}:=֣3ݺn'ieۗgs (Q|(m vf;}AI/m >-C@P@P:onMX6eYv=KNK,.,R*[gw>%AMZxGěv#DtWӯ$PXXn"( (~?n0N,qZIX|LNUy/?0[[~ L PZ[ݢo+yqôE&H@^4~"xC4m8Lc"%֝2] ^bݔCh (ɾ2xX{&ݽnj evZ-tivIgz*73e_>5Y|3z$iX(mK^UOhF@ ĺX|N=p_?d_ٻڇ?5"-m;QxSνh0|{o#ojwOiixI+o)ݢo;`Wm< ~7Q"ktľ<9*k}?~֎-۩c-~uo-?2[26\PbX2>GG8r=~4(mFo[>wT.MDkc+Ň-UTuRKƪ ^ w?i3Z_c):gp/̎UYAƬEd:_~.oEM_>3K(OHxrYt۝^OnmuYvCi4K7=̱`~ͩைԴo__V}3]Ӟ/ZM[t762nYzW^.iosK<7f\%VvݝC&gs,h_|'3xM&flP (ׂvմOqi}k}}ݭwvoWFxmVTxGB? exYl~$xzvլ-K|RR6g+mw^rO۴5@=f ( (8+K5ݕz藚E⣢\;+pK*K|TgK/JvzҸ[[{ѕunHVi|)+= ( OϊiojE?ҭn-Ջ^7ַH&HD78uCP@:|+a3% y;~oo]o|.5"{(>w|D%oK$w6:3[:̚p6%S}@:|_ q W{)4j-+S`/6e@>b$~%>)|q ݴm/>Jyc>ϑ>_6*h{>RWW?o/COzSAz|H("dHl\D1y%~^K1_i7T-{7CncGuS@Fu[O/ >'}w{4]Ͽ+exLVE{|?Ykپf4 BVgB"sD,I/λw*36=)G/|?6-b_ x- (òWoJ.oTW^>3s_ x>R-*S5mjW9w^M+wiwwv` Iw ƚwVd"UQQ--D Qn2 z (O&kFy#.V)VWv_--?h (z_о'xxH"V-Ky|Y|yM7m]]%ͷZ<# 1 x OM1}ͶjZJͪ }-B>KuQ4+xfYzK*nP@WXF&B]|DEKLc?,[i+b?=xº-/xff%x~m:wY}o8u[Y}ZbQd$@CP@;9 Ɨ,.|I%HtKIk{tF8x~ivOh>.n-CĚtQbY&e]o\+zP!/? tOX\lFE͵}cڀ=hO#uǚjw!ӭKEfKmKTK1-ݬIuJ>?eW?1Vé>3sUt%fBΪ6DV笘E쟭OlëF]?B]ٵ!7Y{Yyj$5 ړzM(Wm_[=ߌ4;_LO>~>Y#x7⇂o DžMaly`>x&fE*m@@<,txpضo&bvʛ.@> ( ({\| sm'xP.\ oڮߑaԜ2*yᥚmJ( ( (j5A=M/3}05 ߼I~gݶ+twٻcKC2/ #P@Eڶ_־.-jvS/ꚬiWeH!wt̊V/M=:B%8Qv$QFj"@SI4۽C军eˬhKo6aq,Vq=͍{ug^%VA懨jwVw3,B%ԕteeeeր7(WմZj~ao%}:(I]TDE,w$4[K1iwzoC )Z=Vyu;q |$WwF]9z(~"BKjΉsi0u%7+42im.!ޞi`ĺ_şx7mlAeq8Mz֭Ɵ7s7m~*oJKpƕj>-nt:vGʚT޸;%t&Og?>֚!4ɴkj,-ip++.ަ3?/5ٛH7M?A6jUai.KmƑkkBp)4޹r7$~W_Ὲ|Oqu;KUhzrY]fuGV5A_37/߰g| }./K/^6Z[I1\$ĸwyobO~^9Ӿ6|#ҥ=Kt~\Y? 2ɵ!]~j+S5BO-亼/X`{+ t}V_t/M΍y[MBֶM |\ccnѱl P@P@r^. x'oY^O*oFW]7+@/k៏/? 츖"Eq=iUO:X%"soq%kwpj ( ( Ouc]g97i>$TFͱ}ȓy+?v?^9nbٿmfN<k_M~owj( I Fb<]m%լfۻhu_ZܐA HE|E<|64_5;%O,ڳoޏ}@P>+$iPxL߉miڒ"}Mwt{' V.%2}TJM[Z77eדJ]2]ݘ /jv~*z_7"IKxSU˨ia-lmWȊ;+CV>ʿn4V\K}qu[]:)0ò}Py,|cwc[E$^[K'Ӯm?)OOuu3CbHa'o*g (M%}@?=JA|3}>3R񵾾xHD=FG17~?:=Ś^?}.Թ}6[4hݓle|C/\nn.4FYS;duett`€;( ( o> ԼCox?<=:i7,%>lOw"/%I|'owkmekI.Eq줰@P@P@P% h~1еxMW(<2B,R22SE*M莌4]S[I o_ Z);4xFUV/u{X[#Ί #[;]Pڅy} @PZzkhWIkyDCw ǎTpUъ<"5}RR'ֵ{h:YݿZ_[Kn[' \E{|f>?vX>\8>d֑^jҺc$U)߀ڇFo-"$>(uȵ/j&{ou'teݝm%}o@zxJsP; y.5 ,EJB")fv8|w| _+u'q,ok"]\}Au [C C|U?ŏ z[uK=565vG<_hK'~/4FL\Z߇+Z7˲b@Qh.5Jn~W>'{*wK-xOr荳r!P _?cc9 |J<E?c/Sru+6uB!++" ˧~zH:FO ?/5#nwǤl7'$/߅_rOgJȋ]C\ƣ.t-c3:m-Ƨo3O(wgҘQ/NM}˨y~O7}_-j6^?5]{߉ޖ"i]YݕW4?5G- -/P0*TKT}sCjFߟ=}S`S? };! RYiwZd+n﹟2"LڏG,P>T;?P6g}˿fşVDZ5qskׇ{in5;yyGe۾(P /5/zjmcKqwq`A r4ʫm|M|\[i:',on6#H"Vfڈp>@C|7N77K尰bYM~߀;o_Ӽ} V66[P-ỷaTv_"uQ+}@P@-k妑ٛω 7z ~1OOx;{-i6` /$v.?W&kP@P@P@P@P@r*u][ƞ 7ZFgW@ʬq"~ ]x7Q?+ ;%ޖ<'s 9FtFٹ~7i> 4G_^Ь[ qu|%QG~U[_$0`xHhO3K\i#2JeMi8B=|Ȉ3j?|B,]S?k C۝.MRW?~)Yk~˞?b>]΅xbg^xI[x]nbQ@$([ljÿ6-łE)<Һ"**h_<!5qm$؍#)Yj#ǵ{M|s!]Eꖺo¯ϩj:[[sZ]]DVʋŵ,{F"~ϿtZ_-c7w:}޽o ByusgeY_z(Qx_|)]Z5kbXˍʹuO K-<-iz˛]#D{HbUDx坍utP@;y@ <~5M15 :~dm.C,  6> ( (??hZE-&*Hi&wu(Y(wDEguZm#Hվ*o_]#fF2:8͹ q:EP@P@P@P@P@P@P@r*u][ƞ 7ZFgW@ʬq"~ ]x7Q?+ ;%ޖ<'s 9FtFٹ#<>V~ t.\KxoGvfv"<j|u%ާ KVL7Kx yܱآf[ߓq8P@<1xWl%gA"Wn"l ّ|n-_>Go>wV xwolFk|h5g3Z>ŭ[vEfnĺ+lܐ -Ա#V@P@P@P@P@P@P@P@P@p~4/|})x[k3Pol'^ZS$&h E,Gu`3>%𻟈PoE_t܉ot{XVv6gnY4}[KmhWY̳Cy 'RUѕZܠ>w D%[wK^<[uvVn΂#lܓ,6-Ա:#EW76?":֭Z16@MU;P6nk.%( ( ( ( ( ( ( ( ( }Wj^.7[x^E敋O5Kpk+D3P  Y参}-[<NQΟ<-/|wbA@@'/oݾ"E' &uuҀ0~ W%%AcZ[$7­ՄaJz)F]oPq욵E4/ :K $qpoozx+Z_ onT5GQKDEDE((($( ( ( ( ( ( ( ( ( (9OxK:.-Oiz #[cxeVG8MyO!n|;ڋ'4'j MJy`Ħ+,{+[ "i u;[KHXuҪ۶%MdIPx1>;>$<7ֱAj8Ha̪{=]Y &<#Wյoڮj7zwl|C:g{ّK&]Y.P܇%Ҽ1}I GIݥYfvgiegYvy]ݙݚ:( ( ( ( ( ( ( ( ( ( (i0ՠ^{u៉6-<;jZfkV{e{fy eUYcTw_?<?ӓuw] GYtrvw?ٗڝV΋ gnwsʖ{Vy^?MJ?[XhVXİg .Ċ(mDUUUUҀ7( ( ( ( ( ( ( ( ( ( ( ( ( ( endstream endobj 2924 0 obj << /Length 1547 /Filter /FlateDecode >> stream xX[o6~ϯ0$ëDú֮ZclɎP[ruqËdQgC"!u>jG?]<]\N #BP(͖P",w|$>q^qR~s{c4pn/1?R yKpv~ d!mDI]`[J1"8$jD[/_UFEO%aWQ٭o]AP*/˄va4s'LOO4ګLUIMJ`vB[/ELӧq!1%BYͳ*꼶~gie%uB#0$xh4D!H{I$<:xm3F͘ y]iܼ,T3( -CN?R׮]L_rmĦdP9ot`Waa&QnOHyZ(y9D!> XD%#=H~ZKdYP@B*;[8 ze,}եW1vPD;a%]@{//]rI^]mz"q bStWzS63k(1EbsqPvzb;._@Qh<"J,0tV= Y\B4>Zy,.0'[CjqqMF A=@<DJ  QRjRcCEu)rzDEfHtGAQ"e(1@1ddE\B dchŦ6_`bHhp44Ǖ'> WoDUQl[eʼ*5f5ϝ+jM2/6es$MKy-K$* ڍqCQ ~RAM Z e@QwǶ~@YGfۀb@$ri"(΂nP^vrxLa,4fȊS{s:X荩i/e8NbtnAb4M.*җNR &N"V_i5g&t-N[pjd6U+TumCqK_Evj]&1ܚ;OɋOw`lP0>2ڢ (#7Z endstream endobj 2917 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 595.999 420.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 2929 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kiPA endstream endobj 2916 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/us-ug.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2930 0 R /BBox [0 0 596 421] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2931 0 R >>>> /Length 48069 /Filter /FlateDecode >> stream xI캲%#krLN2RNxo{|/z gK?C^<s?lۄ鳯e_?=\<+\|\cT4F gFF-gq&YNj2y颲Dmp BL]e6Q+x#Y}}3o}(`!<}c˻uU>@37eG׉ҺJVŇLsX^6|97oii~:xO3g8ܞ<(2n@=j-xyMt- zzCp &O_@++gdge=5}VaZ&t>vzb7aOZ<3B2*yLLF"Q'5XvfxJN@ޭIrB~XU!٦m^{{gW m~IB35bQVaZJ\G_owt!.qr5Y׊/UZdwHZ\jpgmȮNy17r=(mK$ۺ@e_ nbKq;V21-Ucqlx?Pz%&^}6d_{|ۂ=%po_V\Բux k dLE#/K0x,QYʺʓC})qmop2 ,./-,PQ\*VzE=تBeH0;xBcf$W>b2F1OH,-tV 7~.[iMM#-@x 3N*XɃkWڦv$4Mp p{ 6F)J{ ϻ ۆۂx!x-`>1, )9z1.FC[Yt?OLާ0 ߴVF͈wIVi!԰偭5 B;-ROE+!+M%^ah'e48 1_ /y[2WٚʶzWXB++7]W2_F^,xAE/GrJV)v`쿶KuXZ*ʹ:f:__V] S4:W!1[gS_&KCa/G n+{\L˺sWH N*s/-Or.;f-E+tIk 6{U7\^>atM }!g_xju&mhFy tHh&g.ǷrU}vĸ.iIlˠ'-0@ rr MΰkdYϲ8]2-b+OQgAw Rp=zކ{+!0vQAܣ1O"1CaK\S_E~G`^߳JS@P[1,M( t%Qwvs)kxm[&|Ϻ2bԆIZE6|(TؒUxo9i (DMP&xRxe(qk G NL6ɄLBUMBl[{[)ʡuf+O+529OۖEy6CUhaf=T袪:F(~h'yUh 5'}3ιIm6wSYzR=n.ɠmaQus JӔ9F%b' މ9?ĪV;¤/CޅIz9]Vd< ߭ZjPfzPQEjsPv T49DUĤ+~f2UZ XW!12ang!" 7M-By¸\*@"dv5=IaLW*\By:04 i@VY)93I z|测ʼ 2sWDbS L\T47otLQwP{AV$"])ˤ瞀h?ׅXlmSJ^Ybe$5&HK ao HKo7Kc]rSچ+[!bpe9i^jm+K̼fAoÚ۵"_}ФFaԘ/vig16;jپUTQ7hFGjPox"QgpZa`m.pg"xҼ]V*RtZ,wOBbeٰn,N{IYlw3 ,`{ N?..|:JHc-Q1#m_'wC0~@$Ѣ>c'V/sܿjWǕ~zrTN0g(Ne߸_>n~WM^7x/TF˸ՇJ;{+ؖ0.ms(5`TQFh*V:uQ/$Kk} wr{;\JHeri 9! Lzn?Ɩ,`I(>^*ZۭNӗ݇Ru^ S24fTݿog J N2M/@?T xV*סgpKܠ[g8?;]ۀ F{Kk{;k{akew{1 PСgb{Q;dwkZ onM2UxNAQ)ߴI`F}J=j\W9%wuf>o5mR;%ˡ?w)z*>Z{m^^iAY߫V8mq; ~R8þ'†S8/S Ni'x8C rJN*y'tN&\5̫vmP[ Eof6m!%U< ]ͷ{]Bkۣ:e/{ 蝆UJ!>xL3.E2D ʛFRUT3eӱW] Jˬ*T)K{^z_!q~euebN5q Lqќik9h ̶j_82c;[VͰU K#DǴf-$TU0¶=qLwվ[Pkd g),`ba3+-pY1*KWWzi蕡dTހ~jkXA w+_X;!SXV(]2eJ9HzK~X'xwǡ#ksKB _-zŘCEF2= kc'^9wyU((Qp7@D TKjml^K5lmz fE(C{? $qRaAK8 >>TK~&wUl9S[oGW +%8uL|}35aD-dGt9{b9쀲Ls=9ՃwUJ-U 3j'TSSz7 cZmǫX`4Գh,.ڗhm LʿwAFBw&Pk+w gfU)fsM $=Vs%i 1<5͑1eGū-!*xŲjo>;af]в;iox'$+3N--:/Λ/蹑\FR W~8s,J?j-A."5k tpj[~1ձ[Y]q+L';,l(,jͅK*m7#xn^*OWBh"z.b7w#xݚu_.*{Y(m 늁ޣp8װvK ߇|IFjhDim Ǒ^$5ğxz9Rɒ;]~BR^㡂 ʂA%F,cCy-hxJ 8O.ԃjgN>{7_oY禒W&G.]2z1~+sϻ_* `M_*'1Y NSDcrx Ana+SnZq*@'1RY:ʼ{T֧WF]ᗺL[/TS/l+efE( UZFǑ6M\9ua/PDY-+_]rȢv}L+J&@.•￾X*s(eh""fN!h E# _5B Stm]xoAx!+̝Uf{DJ$dVr_Ӟ)麹Q,uY{C^2UCwЗwH$EYy>͛6)&#ʰA+31mq["L'-*+_@y2V]V\K\T:.0=ۗj[Dcm_FBD!K̐mӴφmƮzCFŒ !@(t,سɊ$bm@: _᠇yיS MIioiFo` .>\}">",w:vPQUl(dQLL!>W6vk#MF5:XLS4Gg&*x%Vg?NMM7|n`<bxCO(ut>0}>c^+]([*J: y&ٶ˞8nmab ygHPϒE |flwtoZsrU9_+? }d9R\y@=',䜀QYʬ'vsY݀l@-x|sJ!|T^xPƑakidqf.~gQ59Ӹw:ej(BJ9Ri 3WPzn?JDPI &Op\:Κ&L,N@|@A/rml,>RóI /i CL9I O-RgW 'G吓#\qc%-N;ÁA/jlw#-LzsT xFuqDRpﲌm  2;SSN@iyIsl9-YˠBQ@U,NU*{WO{KXghfw;UeÌjMj%ګ*WpePlOvc9sOq9 ,'ߝnŕ4 ,֜ X}۝`J'jsbvRV OIdO*6ոˀZiƯ1kղzVjS) / T慙u2̣xB}'մX@||$[)\~ۜdMZRqc5S/դ# sEϴEWTV#>y={nJw")Zb4rN9^+v={Ep9RN;%D1 'lؐ@(Pʧ <|El> PzBR\QB-۽WL̕?_kzȥ *D}!K0E*MՒ7ZϬC?PYb0ܙIoGr1")# kOK }x%I iKTT թ9n$QnF lME+PTƞ!z,~>mz"IQj4uڷwxW_b߶PtM]?X _$%ש }5oP~k`H1Rɜj6k܋b?a-hi4:U I% 93@6>LW(O+j=z?xj]-es-J⩄IXjOJvNΚh; rr MC3)ŷ[aFaP\*PYd/*?cq+|rdW\(xvo )YRS.Zr=e\hUu1Q^rqRŹ߂12}%x7. SayͥvMRI8 cxLU_sU`J=9Oteg_Ӫ^+rRjmyum[U+QU!PI.~nꢀo p?i3FE.m6I܏Ƥ(aӦc@US|`16DPza_Uu.i}Z(ɷ*_i܍B sGgWL_9seن5~cb|'ϥa><@s =5< Ė!_{xȵN?>@C‡0!}\m0?<:hS~>s(tΡ,sȚXc$Mɇ%c΋Tzw>=;?F#q/D fE6:8׃*(Ϭ%P- ߈݃=tnsY~Ȩ_պvHpZ}Lt>MkqU GΔ %G1d౤1}ӕB{%)gԏX4㒤gvGBgx!y+p=?ݿy$7.0Bq2oTE*ye'x ok O\( p*%1PQ%/y^ 3p|",BAŅfq1]T+K&/0I>#b  Js eHA(s,=Y u8fA?ryEDg~_OlƗU{Q0B0BGF\U!nYh5> R \JӠ Q%,1,&<0LΚ83hcLˡM?7 ª~U*GP0=ʛgJ P֌"0hB2%@UQ%|w Ï\ 1 jZ_P%/ R }HLCp\fX b5.]Tūֶj~C(C7Է| ` |ª~Uꗸ Ϧ`z9E ,!  B*^DK)wNO~hn㸖?\fX)]T",̃> &@ŗ< \u M.a CU*$d!\*g#|qu>O8zQ/.L_]6Uɢ?E.(PiE'h j!> w-U0 *H4@ߴa/g$7. L2Mc&kTp1 }OBa JBU3p6 '.k1|U.)>e- R Nh`\qP/E(X %4:.}T+KPP2e1=qjP.fEU(>**BE`x3!Bq,‚2Y` ^YR/1a@d }wEeVa@tQ(0{@/q'@B"e緀,BYGD*R\Ӂv:7.e`wQIyVgVʋK핺1I`Wງct~Tk^ICǾ}O+HF<R"P.}5a<4Q 'x,K FM:2b &IǦ0R -oSEF?ϋEgƱ)`{C*j8ufA Fx%ޜ\ x JmWʢE bʬBwم.Y}t ͢*}UJIe fO)b'$ R /vj8Q. zTJ[aFtdAҙiN*^I.,JYB˔G_ "*xYG\v7+h_).A),iHLP$1*`IЇ< ,B9&:*xAPPbe_SrPBt!V(>$& J * ~U enjJwvkKn Z#P0XB[px%qE_IXb'LueCP0}T *}b_ΆqL -tAV(}T+I{P` V[X(ǖ!X( ]J></'<RB($ # o8ax%>) E}"_*fSn+4@%Lc^Oʳ(jTcD?xyL΄FqaΓ݊A#@ꙡ&Qil9XX$׺?e)A鰭ϻ]ݳ\0 >ݩWû&@񟽿-ߌcS87.2TBq2͂&lU9E%n*( 5Ę2<(ءlQVET eK B0r@)KlP| NDbfU *^Y`2W,LɁ6xQ\f1ʼe1 ?(XJ7]Ě(B! 62t*^Y`4տ,LY{` }D'&CX*^V`|4\j)gJ qiR`໨WVlfO0ŅKhT,C:X*^T`(XJ*!L,b‘H3Ad*^D+. &S0oU5xQ\f1 fBU . g HL></$<@,]e i}C֝1t EU D$wГZ>'uMgvپד*(~/um_I`W $wCr~(P_oб}Dn s{h`]ԏ1<4ɵ.R̟x,Kḝt `]ޱ) T!p #޾`IJgȿ4H(5A8DdNu#L #GDoNAэe6e6Yq ^s4dF[䅂PPE`/`ĄF_w]WL*+^R`P蛺CB,L>!VʜNCfKbA\% `NdY;:KYąyGDo]Yh" @aV 5&(s: Q(1Y cL$KiTT+K&:R()ԆO0&4 P0}T ª=̨h_(Wt GjMht;u*xe(A0B=mPc9M+ U*eO!3*fq % #.\B CGĸ 0 %S\s  LhVl{:X ^V4dFt P([fjMht;u*xe~*_Lg`?:3'4P0X(OCf .`!&eQPhh`:Q,R,™>&Y뿷pt1W<,kJk8aAIQG-5t(CDn ?=ݘV$k[8,k_}04\)K?2R8^g7],LpAZ[6YmY ooF`?C(񟽿gy$7. TV,LB!C>zcr ߊئҚҚ,*xDž2cma >f|oFKhS`W쩿 Dwc-͞Rʞ!*xA|I6\\` ̇>F@ -L>$z75hLOeOd35"fTˢKvk(%)ڭWoaP Kit٧>e{-Bǻ[N'd|EU BX"MgC+o!AC(4id*NI^2 ]J`r=!H+V3xAXbzUC0B/zp\ ҅KhS!`໠Sײ΅d }QJ'UL= '3A >(XnJ)E,p$! #1t*^IS(>h|)=Y3Ϙ ]T b,̄> $f_HxP vIG(DY GUDb)BT~$sFf1e^P#hgj?2^OʳzV^z8|wpA\K ^@>ӢB}Dij qNH_+h.}&XФ1L˓yN=pDqgԏh0eaFl&7r}̎T|tx8y %g Ox"s@\]TWhY .}T+KDsŋ)KϨեPc3xQd1PQ5/QvZٽ 3px".BA~%@c4BQ%,љTW 2.SJYR{28PQ5/ Q,P>dPP0's<TF\(}T+KDb%LC+E ʒ-@9>U0|zd%Q,'XF:0}@hY r9ڣ> Cj }UҨ*Bhyt܂/$A4BQ%,1*aJW6{B)GP*>j^WX@&0 WJX;-B;?KiR`WW lfO(HT@軨FU)"g!J {`n)Xp(4*ye?5/ &S/}<hNhP+yi2l0z\ !\!J4BtJ^Y"x8e g~;)z .@J_!Q'jXi~^s n J ;Dž✐Q?5g}LDvV L fR" Q8ռ=V{^ K_}5ljDz ~8s37],B`0=6іkch o[&hEgoi)yZ).F+Um1}Tū/Rc0ښBw@yCUz͆݉}_#[hU@W!љT׸ B4{H):i~B txi e.TP[$ 3+>48YLx+xѺXҡ(BM  %Ak7BsK&'X6ͯLPBb4W,J'B= Q,(|2GOE5B O";2Y`*^`|Y(*kR,bJҰ*}3 VVXP&0[CnHfkChHQ>UH+X@ ӿePKIT@P+ PFu|Ca+Ûhx-DY,*BC)2Y`*^D R)j<,IhD+U 34* >PŮE_ BP+x1JRZPr+^)ۖ,ޥdcFG囪|c<+j1#]s}yH2Ź@4!@Σ,~H&Oƚ;BDzƖ1J\ w.+h@4KrgtBfV 1e{|-:?5NH)D0. Bq M%:sK)uΉE@yCz5B ~!`84J?*^I7wAH2SF)MCk6E P^P Mxϕ>(4ɲ()Zhtb^<*^I.4F<܃'4('TK]-~( f& gf@0hT'T+IL&*R)1O>*~V@P/ Qt1B~D_-J"&;ASV)Wr0 R U͞P LiXs}E,J{87H, +%, ,w,Jp)($mA(BZCR `JӰ**xYX0P4=~0p(4 R P$c˂ k }9)T,JoLX) }H,|yWXx􁥄R,vYD_AQCixE.SJpi[#X`m!0Q BrNY׫noGP_r9MsgT2'P~&ryQ}%>Vo07DC ̪;~]||Uɹ4YѶe1A Fm<];{FDwQâ5}F_Mk~XVFj<7.kcCe^Os(-mwo2E-%MC6&oNx8怢KW V \|N07.c *a o_m f0 mo+5cnˊi*PfZ L.|ʻ4quyA* /‹d#av7˟q髐 ;^]ɀֆ q^Я 'ߞiuur^9MWtfd|I yU&ra]u3]pNusSvxaYq ̺k~Xx4;;L#fmח|PWQQqlsscg{F*> r^őa_Z`kŁkJO7+?Ei9M\vCe^O"=ԛ^D}onEP#JTwZ*/;4*􃭫' `T6RHt!5~D?h;4;W;|5@jCsLVߪ[gm]oNiP~+խsA8HOQ )=Vg=Wx0zp?/ }$(svp`k% ЭhL (CevO3>Mw/+vGo -,:gm W~Wa<Ө}.(7w~ػF?G.׬r6zMtš䵺z>! RX0NݔO+}Di^ߌK&s7WhYOOJAp_i E8icߏ Πe}[Dʬ * |rX3aQzvs7 ߼ipvx/lx-$?W[]9Ɣձo4LF74o7Ao Giw|׵/⍩ ~?YkGEG-xp;It~B2*yLLF"&t[ek6sQ yBrB~XU!٦p"3ݧ 9T/sS_ݚ)]vWs9m,]KؙWRo'k !{t9Sr kFKg4ރB}B $?CW:g-Qkh}(^ĿFǔ~4?Pz%&^}6d_{|ۂ=%po_V\Բu(@)Pheo2*]YWy242 ,PQ\*V!-lb f7#%3 '>3ګ^vF`Mh'T $vL 5uI<Ip;iLqBA+mSm;JTvViQ%FdD2z+m D/<r*cH疅9j}bgz΢s=#/Us't̲m`JK;aʓFU*$f|~ldi(h#mwzkiYw II@q.EIegtЬEpM/Uօm:ors CѲ"feDQ˦7^ʒSڛi6,`]wm6]**yu jeTvcw{jE 힧uΟ%+Ԭ/)F^i&aT6Z.'?4:,c0믇ӡt,[SE8c͡hMQWFDžYG_G*g树I zT!;<>13} mm3L7Q>Maa z]u3]Ӿ[ gJhALĪ<*N#ȨQ3]fnvcjŒ1Ӎ*nF^@˅YGk%Aa]wL4O3 2l35(*Ky<>Slk4}ӌA,?ʩ^+Ԭߒ<W >SB ˜P3E F%E?q5* 7|>4 ^eNf|־u3(?$ AGbe^P/7)# TiY0/qjٗ4cF:Yg^|.LͺW+)F^i&aPu cSyAU!衲Ğzy:9&mӜs۲W(056UzϔA#/40*1)ad2/׶-FFUH,θ4߯ѫ r/#J.9p(u |Bqܶv)HG )mQ$U^ ~FĠc< > ^eo:r5.qJ땥j(kWO*&/;&x-""w6@at $i7mb\%(PrBi2U35,:U,|z·2<&rʼJR>dK Q vKBiT}4*T2 ΫzJ^xL UIK>n@eӖi߄PLU_|R aYi7ީg0ŨB`虒6*B.ƀ.NyFR *9H7(D_]4P2(i=4zEq|e^ ]l(YaVU =S&EXH.DgTŋw@%:I'ĀF 3Jd; -/2 lը. *ugJۤ }nօm@%֬ |w@Ystzs#[j(iu(7(tUw*ugJ٤ =*xm&!;B"kNuֽw70BOh7h yct}aQp.HeT[+)=TK2TtPD 4ӥ$Z%jm/]-L$ eOרEYk)=T+&:{!9Ez.\i EH'M}K_x(5* )Q"^l 7TtP%CeAwc%;>;i(u(nTWFY$,~5XyMZxM2Yd3Sz yD$)}"]ODIoOB [3HXnSLYRk=T6<*x)T!G:!titC7w"D % Yx9P4wdMI2 T,@*PcakF ?U =SbkET8@+*nTٓ΄zS$B_Q٨%wZ:Gȓи^2-V@1ߍ~ V1R_ŋ[Ǣ){{c%E**wSq+l \mYjNȴ\ B?ᅾ χ+ECX*XC}h> 2[ԹX, ,JZTed1>.Xi3.ǎ}5NgV,1ћEY`䙒3heB{fJۥ Q3EAfr@e;.t4RjǶF^xeZI1I3kP 2~-f3%-h~%:HK.[iw~9#-, A3kP 2qXxe^P/i>A=Фk-T/DI3V@4׋tpeRl0LB Ը>o gK5#L5h}PPJyQjaj&bRl0L B /g35[$&%:H+:ww@PF(;{QiajMˌ#*egJנ d}i:H.Ϩ4/=T#mLfR/VSQ %*P:Bs60ҡN)CqoQPt$aQjaj&WBi?T(<}zDhC\@yJUI^r.ц%5V%"e(r(Q4=*Paaj&taI3%iP 1t6TtP%ށCe=wɜ}ӼR..Cqs 2? S/M՞J`R5%Bz !V/Y*rV%sIܹD% ]&Cqg 2 SGnRl0LBk5T4<*x>;Bs6.|rwrQt=0* dhOB`ݙ4H,P*1j#ħz9h;+e(8{mQ=*Paaj& ?T(E/t7vE`6lTmc枍!ڰ,Oӹ((ҁ0ڣ*I z$rJp =V]ufs&w<@=)a]Oھ4QWU|kwۗyy괾3J $h1iQ\ ug≰hqR05o<ɞ6!{k6*l8v T=yڗ8Zvݲ|Z*^P[*Fgɶq?!%4z(\u,mq&Zw򎽠/}c˷vBkT *oIYHZx?v siW]gS ̔~/9I2 uҞN_!7ϙƍ̵ہŜy|ܓ]qќVhm1A^>}։"cBQ9cߪCBe^ C,l9)B.MނZ[ mE&(t0}:AhPYO ږa!xIZ#ZIW6Aiakij_=ۓ5 &)N(tƘ>Q SҹIWü]'mP84j]㲪Qba&s:lRl0LYpR#/m3E S㒽I[ C >nt};UJ e^X%:XA6ŠJUo4B' ^e ú^q{ 俢KW+[HZ~P[y$MZ8bZha.0ao %弢 5mbCQwގc^xeXتII3iRI1s--I[ҚJ+ۡH{b^Xe:XتAA3%iRɄnXY'Lg$Y)^K' zE: EaEI+3.j4nRl0LiRcLtyd>crdY-Xa~Ci0Tk>AW:q$eNjnO4x$MZ8#1&bL弢uAhġ8oHB [5 *egҤ ]-}̍1 S㒽I[#mP8jX*X%:XAT *UgJӤ ,{ix1 |rzɲXFq-1BHSָ(5q[AQF_~GT)G*|򤎗-uzAD+CJUHL H?Sa(=A7ʨumI+>Kuphwx@yJUwv0.:B\\M ag^*\xuG gZ#/Za0**y]͆a\PYbT˰p I@ S,/P4+˅&.0R:{\¡Sq?,a8PAVrgw !+J ŭ4/2*yZxioUzϔ¥FA~\Ȉ(UH?:BbqQExwnh'F$[]7?Uh =S" ]BXTb-7c⒃"]+ m184(_#**P۬;7ٺB`Rˇ ]*yq##â-k,8]`u#bQXdWqL\C h9[UFPYb:ЪM ꩁzl&DiÁEWF% o@`e]w\CCv< Nq 97 Vs;fƝg^*ZxupG gZ#/t0$(UP~,pQ#L)-zK~X'xLGmnI$sS 0?zH6#tps6v[{* (QBgSȧ%_e9m`h_ݝR6 Z1jB/5C;?*^o,UWMBJ U<3ŧ)i}wg ~@ 5k~!Lh쩭 5=`95+ڱOz t2>8|= sg?41`kZ~}=TO] =s4/.e&<N͆ 'IbW6'Ԅ✇,{0@+(U= ~ %OԬ AyIV^z)O#ϘD^ :@iP ET}>kP!FCXTSp >n nxAeebO4xD ZxZhTGTɋd+P|#xw#G }dšP8cWF$ T) @D94Kˀ09WF$T)7HH('/10C0Dq91[3P1cjLI P\ Y?o3t{y'` }|r(QU^٬*> >ofsns3߆<b婦pïd5uK$?H;pH7 %< ^-,@ q>e>om>֎0haFPb λQ ޅ_ JzΘY/Ӻ%Nim>on'@ >$sT;VzR;cR&s#DgT0|wPDs 77j -1>wmn_3[e6=ڐutf1+syyVϨĨ* ħwřO;ˊ>Si?;L;b>s'cs§w~5%;cNf@.Wy,Ds d.b?d_G { ِ V1+x/Li2*O B^>{,Q=#3| #ÇC]5r&0O8+Ou Քtii'Xk==A~f.3f.wkgC?͇ |2yWy)|WS޺3feV <HѡDgTū 'y%k;z޻`rB9Qv@ʹ{ Μ/w*aq.)f'D燀:`^2gxUV%ѩzLKSi2!a'!jPɼCxOx\=-?r VGڍ*ȗm%qpP;2 _4Oܾws114*h:$J܏*VCҜ H9nyS85Eua-3NJ M`'>:,]GEL5eǫByvLʿ3y >]N?4j:*ډk9t^eUP>ibxjPʼnhŧm8T&[*x;Հ|˿Ðͺew(NH,S|ԲZ[yDp#@e6ro&*|swću{GͼVUTkxaA+y:{Uk[j4Բ QTrPć1 v<QQ1Uzϔ˵F^5 ߕ_UGF%&Ouwcj'=FxeT`̺c>ӟ^䇦h *8qfT!0I>/';@WWjLGA`j\7⭽&DJ/WkBqQ*Q|)7o>N(ec\xeT6FjUj.\+[ˁ 7&`gTɫ5& /?4z,19<0^Fm@VV|.6nAm3s1&܀(UVCDyJWF% ƬvZW->SFyvmɮq*g,˖a$c@ U\c7jHq4d k_Ta=y#"i P2@T oe:דQ|IWlN|%J) ҄ o&GJܹ@t>PUX&| ]G 8AP2(n(*P.٪ׂz7C)k"ؤI&@%%\ ]:2AdR 9Nnȧ췿o>5:@(Zp(%n( gj!_ 7B* a~SfGY`t~PU K9A>}Ja 018' R\(ikĽ*_CT o%8:RAL6gRQC :Tq^t=tB^ %2ʥYZD:q?7Ukr$ &@+%\ ]I**,rt3. !g rCDQqYVG܏GM[a N[D|@%E(2/*v~J.pftP%[ s]ʥYZP:.q?7kvě @^:J(g*u?Be OH?L tl?uU(NtWhth ?cT o&-ȏͺ+Nݙ*] ]Glmm`tʀP2(݂N6ԕQ.٪)k"ؤ &sis?J@tH j)qjtaǤJ$[ 㘮Te˳jRSH!o*7K̀kJ@Ud^PGltHtXsZ#;O#CAa_|:c}4]+l7U\LΆ9( IQwprDBJNvzP#T0w1 K4|x{A~a :yVXhAЙD>||btTxKWˡ-Xok#V;asJ [ǎ^~ݜ1S6޽9d ~W["y|v|e<?g=qwrKށZڙ'%jeg{xi~'hVwMVB[0m_Sܪ6JC݂~ƣX+M+ov*s&.S7Be]i Nȃ9uW]Ta CzMYC\ͅryVN܉4M}id3jtWR*Rk~ ,+@:‰PdQ0TP.ueKxtnH!oF0J2Ws*tD hGoda:wrJ-MQE,>o*\pަp5\"!/*`4/( JFXJrʺ K교>Op6MeFiF4RRLҐ._#Thx @tŁ!dBOFqRĢoKe 5m| y)Pܙ*]!]Glٱ dG^dtQ 0\(jkѩ!Ά0R"0:AC(qUc(œ%YbyuP2(%4sU䲬Z- wPj 5\ g_g%\*]}g/|яP <<͝2Nq9d] =mD {W(Q}|SeuBU̟L,c;]%FW䑖<^-G@Yק]&b}^9Qf;+@~YtfF)G}[??a!sW \ B?u= FTVmy;9YCkV:cۖ7GR]M*w>-=d]7r,]-2s6Bʫzk:})glDv"v UB[@kQ]:YHF&(ix90uh+=]_^?[yދvCգ'(]\:,ϧSo.6gٮpwH"n+T6ř[>؝-}#\)A/玾tNql]x'MםJuJNڣy-zvYҒ>nkr0%M9Ƣ q{y~&֟e*]ḿ{p)qu/z; y .eNscP豴eI!zhڅr>m}_;S.p[|7%Be/g=u1( Hݲ{a^複Ct2c!}w=W_imţ%E p7;ǢrvsbƿM,Q3R9VMYf%tX߿(pPE "D(d4P^2ҕQ.wT]]*)"fY/} ]jh*5g6BexɩVǑ $%*򒑮rƿ#(TnE8i.S-MQ};_#T !! =HN:D(/(R!teK6A*oUVK |=\w04Gt*_Ta1!D%m%'JU $]smAa ~P uU|,5G^m[8Z*]2E| FU9A:,DxɩVǓ $%*򒑮rƿ#!" fY/q|噥)%]_#T ґ!JjuDPAQ2B(/(l;j\TnE8 /S-MQ."U =N YArj1%ByɉҹC@Wrƿ#W;p$WUQW̲^@JLyQe `*,rtx8xf3%'JW $]%t0~PYKȨTi^?es{ɩUǕ $%,򒑮rƿ#(κTnE(i/*P4EUTm9A:DdɩVǖ%%[򒑮rƿ#(кSmB]Uj"ڙ M{5?2`Nz6O?HFD`|PKkPJPQghثM:%p*GC4z5›.rdY@Th/0q" [Ǧ89:D(bjsU\A wC__ɋ`f8zPU/" )qjt/S`"]9̵굾҅u(iEPߡ6MpViX Tj/R 9;\%_85:d(r(k!ԶЕQ.Ћ#| Q~Sf/M1y:3d9΋Y[{KndQ:B(ЕQ.ЋkFL!o*䇷J]~#3GtUX舑EI|N4D-9 GǶSBre^QI_lE'|uP6y:B(ЕQ.ЋtpvP!o7K3^LN LQ6B?Be 2H&}΅ 2 v(8ӢTp*GcT o&̃ UZ>>B@cFbtP.y ]R Hpp7嚼6i֋-Q. @ s3u1)MJGm %{.t(iEP:u?7lvě/f3Ud*PGlp6E[Ǫ?_m@] +?葳yѹ+Ct_WkWbo4!Kiz 1쮃ng0wʘiAٻu Λy0лΜ V15pjtz Q=Mw{rny+ӡQUN֫ʳS2:EcXn* y`o{ߧ .gP!.w9eEbe=וQsQ2jY~ꟈWx 6&G˫oT 湷/PW:`&:Cb.M0yhZm0F|BGRp4&f vOrM)e"G}޲$m(P^{ghjMߜK'zc6 J7]Y#*4Lwv6V:`ŚAُyz B%s4\(Kjjf zN߫sd]lAu<3ncmsFegCp;ŵFRl.7s4hnmTnB~$epM/LL4v2uʫ*w>'ґ&yEct`]h佻m gp ~ W)P{o+_l㙥YQ:IHϪ:_4"Pu:MIOB녮5Ȳ@`:z#7UgF]5FS3@}/_L0J-f uP# tP2{@ & p:M;sYiWrGGb #nM1Yx_5K-p%u-tP: ;QTAIVJ'XoFU"ڝ֠3cէNM1QIw_C4_J ,)G)T?Bta j*CTSy|%cW5Tzd4 `ɶҬ)GJ)rvT:6iKE5HtׯQ=7[7FM;uƙWhg3RhX꿆$C --7:UDp'dQ:gg;xUFyVPfb+~}ΜiAYÈSSL֣sV6dC$HS`J'< %SҩCCx\W%ZM ~ CTSw:M2-kj)Ƞa\0tf|SVN}:s*S'ܓC}í2 [_RďuZjw!*LQ[ə1] FZ6ęl2Ag8r{nv2eRT*A 9]F|4*ӻ+IMEʺd(FzΝܾ[sC@rHMӑru.8dO'ï:+nj NEe׼ٶw{PC%3*W>C־\߭(J::HN`TB_ RN2jn$jY0|&kG?s\+zFPmT*]ɠ `?{5n28yn!/:A6nT* Pb܅o}R$po݈ԫC :ZjMgGPd )g?G4 M+'Zfk>KX3NKPqG]|#P6w'k-G{n;g. "/}IbKTklq[uvxb敏=abiCߗ^=>`<9>۳)?v ?.Uʮ&Yx)#>sl޻6Nu<+N7Sr$PiAB8A=c;?YP?t!u(Ks|Oyrc L2t@\#tr$G>]>9fa>p/w!xi+9/Dኍ>=8Lc\K*{WtA]T'gN-mŅ0}!=^::|.VR6_A:=M{ ˏ(۫ƔQ3a8ĕ=N\$[H83R 8ON%u^๠ T徻3u[۬W\ JMf\k<891 OaHkcVzZ.:ZN=?~ߴ7}^'AauO) U.{nɡpӍmhƱD33>kg>>g]ۅ_WcrT^w`M USܪZ6(tDPz-"tD.#Ɇ FtBT{dS(M_9| SsYak/WOdJ(Lu+G̮'&qeCu,BxSϳS(_9| {2/9yaUI 'Lv / 0=*`{LbPe?t@~(K§l.IW>9HzwPvMfkY} c?&*]5&ۺ!݁X?tDP9EPʩl.:J#WN9h S>32/0s\z=/m/SغZI jٟ"y.ԣ)up[_ 0u;;9i!g0u(_&A2]pMki+ql -g3Ĉ dP9Ut!\7L]N梣4v^0|xOM8aKx)ql -gCvF3.r)(؊.NWymt.\:CsM"7cKx_kLu+~7N3JǠ %oH.qr*֮N9sx /yY/IMql݊(7=^ $Ȓ.Q\8USzԩO"n ];L d^h97ԱĿ#FY҅\_M0) ~ҐOR>Rõ3%/@0[#1*]5&ۺ몤a싱: VIkgFinط\N!A@{D.crZ \l7;e3Tr}FQZ 0C e>9q8o_V Y'[3Z@/TC+*@vrF<$FK}oA*iubzj%7=ż˘x6xN!>#HBІ/0*^ 'qR(4;7LSd)o\ɉn3+.LzZ@CҶw&ü: Uz?u^%} eRvX9bMM7MәVuVCҕ-Zte' t\%ĢʌkHo T \CB1A*nT>SrVG~bKEa!Гlq0Ug ,x2J(cT tB'PLzT(`+ 2 1?AURSNDc' 9_ qF,$DU_n$nCB&l8 BBOPl1{WFH78$FWH*UW Pf 7K[}4& ! /Dfq?AUEi¯UUe8qB` 1+1DNGB`dI1g2e$=CUE[rOćF&J:Y!Y:7A1$TÝ黁[@* ?A~FIFUl|~UkX 2-$DUBP\"tY6 +H/q@QM+T+[ߴ;2Դ f UҎNOr IוZ11r eDV5$ZțƏ57J&(fܔESj*1~&-pٌ Be eb$V jo&(s%74H>*a ^#t~t,i_b%V;UG/͖얩_q߃1(LYTes j^$d )6CV1NQY,T,kz: #Dq*S,F[.O{CLhT<!K2%)l<\(K" !12BI/waJ%%$-,PN'>#*6!iA"aK 6.+CPSĶQ(yf 2p 1>AU:=!$ŢH|G I/I!(Lq(~䳞ӌF-O{sUD(FS9 '|`1KT3c~dH\3VMcPғhbS ܩ /fֹ d{ G"}1[9dC6Eَ/zSLҒԺJ$cX2 z!lNHU\DMu ޏQ^F.!@J>-z MOP$FĞe+HBl@Y@k@>ӆEaSr9Ca$MK p A; RE-_q[šO@&N 7@.$wVB{ Y,F?Ÿ(̟ q@QM+T+Y OU8]TH e!ABԏQL}ȍ|H/r4b UJݯ~2.si2v, Ariȍ e@fh""KݻD·rĵ3K;"PMPͨdJE2SS+7/W H~+Ø0Q&|t^nv3t}ܲ4.LbAR _Ӵe Ublv c ElG_q`!* oUEoE5+J~&cY&y +ne13HI[ yH\ .,D i/\.Q0-1hB9iO+8|PTf1.Y vdh_`9umgfv*57ݺic2WKY'Sr2۷~v,AlN|ZA(f`;? lC@u00$T)fOW QS* TLgf{$KIG:7v1#~T!h'\`JE"z2\#O xVz6^?qz*5e{>wlu4>Q*CL\B^|y 2«xpHB|&gK`Ie 2cTBmm[AcY`cc|)LH (08`/VA;ߖ9R1i{t)QjwޘOƗS|?gJ 8C0`n*d%_?;Gv 3D7I.P"G{WSWlw/S!^!9ibrxafb{֣z$$Fʌ @U a4|)<٧ح ?l*M"|"‹l= @U 3:]KUb/2aTЎ ҁ }27MB7w"7F_ d|$^&/l^u*ZV C Z_ 1sIP5*񭄡WH|(rK;Iڻu7v , [~W;{DU~w;nB9ݵ:b=yex]彟LLP¢EWcWI;&ِPILP..1,qarؔ$Q]-* GBO=-cc= 2 I;@U*a(Xǭ6!a+ bKe^LdǨJWa1[&$WQ2H2@,$DU*yPLzԅCU@i|@B̸*`tcPEW0MlBBOP.0JI\|>$h߷7@x*]Ei*zY\ukHpc =ʭ %CƑk 嫊\7\#KʌI?D7I.P¢-Wxl6j| BBE0AUJ(_ 1p$ ѥ2#5H.P¢~'ĖwcŖ[H~C~U*a(Xnw3t~,LXAzArtWmlU&8Ę+ Arih: Qɻc Dof YA53H(̰/esl^v̵Ad v P%T4e2dK%T4c%B5qP=^+F$\Fcyu$ oC{~w =m6B͠m]"cH9}4,ٛ{]mm(K@HfBUU1TVe*]=qXGz!X0xWdRiY5ϑR HT1=d5ђQŒ6Hk3Jv,iaZ@ :^ pe0DžrKI@DDOZ$CxIF#uP^HA!!'BUg ZYE4l.v3Aw0Fc{2N&OpA%D텫YKgBUGa&Vў"6J3S'|#1>Z(yPjHA%$`" AU|;A*hc&q⼴N+cPSĦQ(yf 2p I;)hDU|h,l!$"|G $ᕅ>M!2jogJªfȂHc =; Lf Ȕ )%$ /,$ Jz S.*wf g^*]+2#!ѻ!*qGE!& JzZXS +T@lBBDOPBDAS} Zl ~x+,TW`IZZGhM[TP$G;6f`Rk׿Z* ΘhwBL jI8^u4u?zN$a.;AM[OP$FĞe$T c{P% @Y@ b[UJ4MGĵ .{HU3GT-o>c{FJN|ZW;ÐD'TXwy"ºu<ϷT*;Q|ӺQuEzENvºޮiG8]a]^96~0*?C¢$&/`D.E۽Pa]*;Q2vAD ֝(y&TXw>+v5ky!a݉z1D\w~?W}&nD\wuNԾ|&u|uN{GF=폝PQF긎Q9:FǚPnwPQci!qQ8wm\PW엮su{duj=JΪsw8n9::vysn\Ǩu<@\@!h=] e(<9pEo]Pgux> stream x+2T0B˥kiPH endstream endobj 2918 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/vs-vg.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 2933 0 R /BBox [0 0 596 421] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 2934 0 R >>>> /Length 17579 /Filter /FlateDecode >> stream xI$9O'H<@kQ @&!3 ^_|z>D֋z gL?~__cg[gqLcޗugY3]|r-sj mCekC<{m?~ϱq뜧8?ϼMgGC+u; 肞h%յ}_zjl۶v!e*$ϦJwsi%.XOvoK,)B $PR?۴µ#?ޡaflaDz|=Lv»mjkUgzXY> su1[ϫZ{}5}EYm熝WMmC lʂoKgYo.)|bo1Nmܫseﴐq-n6ٛ\3ADy7{|}kh"knEMRx} YsY1UeW-46tMFIu=f)8ϑ~C]&JҰ1 s8Mp#B}bڙmkQYج/G8ѦЭ/qs h0\FA h;9:χ_Yc|.3Mor闤Is?ci#mb !bG{\C :/FUb}~95uI4k%Z'h8u T]]tk.ژ~RptsG4EtӰ~Q5F j}6Ggeq#'Z\^qf羞c- E®޻Km =0hcy<ۺ BZyx^nAO_(aV-ϣս V f=hnIM<Z/VujrjY*RPxZ6+MoİPLmsHqBjyoXWn2FURQɼ^t!Ub6pрucQB9qǎ d} -٢eibdE+T<6+a%s墄@eZCDҺdWZl-!kXWֵ/u[A!nKrЪ[İ`=f-pPRflpc膵/pjj 49?y,5/ 0 LR[677IZl}p /Q Ln8mm"4jPRWix͟E[KYH^34+}|~E(m9qK|]6٤ީ8juLT.R\'+GͨWhv޵2[e5F헫A7fmH9WʓG;doR$~Yem•}K(OcߗPWG{xZ[p΃3׾--9~:T韢&!<}+2m$_Ak[B}"iY PJf<o;)ًiP J=b@?[k[!3`6-T1m.v_#6G@,l7I1М9*Xi6PQr t?OP=&^W8fZU6B,qWA4 ʾԓ*;MsԆyvBox Z<;T9Gsƈj}֜K 0LU\ʲ Ad>^:OWj,z%:# \o,Fv̨,rp xxddvOIn=!@(+Bcsawx]jsJ[1o 4 0KTAS մfU񫉲lhHD^<(T;Ap̢H0P/j2+<=p+\4C/ǡ:ZKcˁy[f9bË 2+246%JXZtUB:q] &W-5Ոԣ7$4$p\sO*r?_Z+,0mk:mCTUZ\;uS::P`oD4fS]p.PKd(5TIu>.$'m=OTsOH. T!El9+e`ϸZJǖ5 wĆd Gre7Tkt@`--@tRKW/z%7Z@jo0 gZ8[^Qʠ,T{qHJ=./tI%?Hb-BKU{/75(Y˲ TI+s4ڧql:IZV*P.56X ;1Q1Ab!lqS4^gT q.m)&_&mGuSؖ{*@K8Dij%\:{p I&ƆFQ)UbӹmscTpXיiܱ[p#=i*xC2BP~xlΞ4e,M_LyXum%"BjWI&j ;6PH7Dڼ UpLr唖wv,EcUW|Õ4B5,x.,V!V Uٿ9]R?8;%J ,~1 |?i{QX. ظ@}!ֻiu^4Ψ|>B"[onJ6mR'&:#~92>*ϝao,>LTq%dL(<mA|46Q?RRΚqlȍ93t/8$GF^E$̪)j /=Ɨd59,D&l-E2莵GXё cb \ƙsId!$s9,%[CZ';bx?4X%QA0BbٳLs:b%NZ@}]p«0 Z`Q%+i# :{tܩgI|*؞g\> #RUJn_=%Qs#ʨdIV=A{K/Z"{'kH,V1%IyDE=I^rJ?d\;̯(*z"fF%fl"g.>6;Ȯ\3᳎ױQ:gʒQYU[׹]*8~UKuٷ`*hU(OX:ʙs (eIw*Zc ;0X)У;4H֩@=κv5Bߪueb\"IԎݦї$CWutܦq"uibKLeM aCD ́9)ʐYYu#su6XOX"S%^sr4g,,Ksڥ|`*@%1ص#`+A2c!^"z,gεEDF"Tr:zjP9YFEnqRO7C H_ Ik{L)R*EY^qÛɢw3m,w66/o(+&Dy_.Rm}L __(Rn蛶fq%8@+^'9\-b*wo#j{9Vr@^^kz[YˉP!r{.%=󽷱4=kPEI>8Xa~ %ЧtCP>4:6\=hU,V0 Y֭gߟ=)}渼@+ࢃ۵IVHqA21$cPP'qٕ^hU@A('Y2*rsD[:_0ӄ٧U2?`2"Μ{jPAYF#t:E~ko(.e]4e=~ӧ4l?H T`gVmoȥ(,h^Ja$ OBI |W0ݹA7d)*!9琣߳/-ӵp w/[L"NkV>7/Zf1b,u@$绠Smʌ L(&[_7A"]"(LGIoագpg/Yi~9afl+y [g]Qimt^7TA:[h/[3K6e>Ry!7{e~1U)uhL=_UpBJ p[!bdI>ʀ}) y$eW>,hCq'  TҦj2d--UhW4~7b/1*5Q$ݹjN?v3/s?#!/KߕIF=gN"TxЇ(j>,@B"6k0qwf/K/F{rbY6At{WT v+)|$>,s?G})1ѽ,o*fJ Asrh{3G]&Y'-#(\}btʟ`:4G:JC7NVP;i9;H h=\( 2S0*7}b47rѝC7Tb, k?(vJH}שzZȘ}6=/Xc+T7/hZ̻p}~9U Z>Qo6r)%a2_.T~R'լ7 '~ 0^>uf=7=he\j%|meZغ2ۼLQ؅#,UXzM!(f < dUh f9AV/d58q TtU+a\?0( ߣ gNE q{ `}U4 Yd㷘C!c A=I +;FKf@E6r}ĨK 62r0׾³Eiȫ1k9XЮe<x%SY7X7T B)ac , AK<||a'Tp6tBi2S $x!FFnzިSN( SQH+7 > t>w jhuVj=YL-W4 IJr <.nn: U =уCD&҆䨲us)dTcFviZrgk&Gw26?9o4A}evp7Ǿ<,# 6kdbp@ͪe3J3oL*+ѬFM!zRhMxIg5eGn4δ1b}!TRAhtU@lM kZI"O4v5xA :tZIVbr#JI BuOU䧒nrY*!7/kk?גGqGׂeP!6|fvєPthhЬwɧJ0y Ǭm^:TQb W1WwriLomJA% -P 0 iR7_ȠoPfhYa[A.0@8Go;_{]N&O|qB-KfTImAU-8=TM&zЛ/Z%XJ_Dyo7 ¢CG5 ׊iqne^&:}ծ1I=M\'hpEIHA#J}1=$n.p}G/ؐO(<Vh&U*n ۜć$Z* rrypKZ\ U?'24!Y9ml]2;W M|tQcVEhc>T+f (b _iIImq1)7e11 6=tzsl>G-A 8*TХ΃ AJgAN3EJJTl2ŌG9AӲBęZiC'U,| *:JUHelho?rRx+MY۠;[ܤNG;9'M8A,.{* cF , ?TʆU~۲F#t BEe $:IA!:8?`s{?B%do!Zz6;1LNfu n>,&ߏB@< '_G v屢U7~Hct Z WPs=dӭ0f=aՍ`%}+"BgS!*b\Ke89ʺ}k#]T2lL Rd5d9 #.EFdp' :{;gj:>'xx= thheF/%J,yj{)Z#]RVXE^)+]9sqH}/]'7TbX ?v<9D5SF[\7x,u Cf7bufy{+_Zl (g+ QQ22 Qė*$6Ui5ThG_iЎGP+S*<'^B;B;vC;D-Ӵ9;/W3fd|3҇D /}'IjTRf.>`i·CThY}P}*CThbΕtQ/}~ =e9޹9Z9m$ueقyRJ`XMޣczov*-Ptl"d/(iq%s"=&ػ5NI(@<*Il)DW {zW`|}_R ٦eO G86 ]y[)46MmJ0~e[7^!vC~Ne뗩whUӋ2ӁFh;u/}9q'ۦ`|" "'佔nn'DBJ1MG|.z6_H.4`ȻI O4e=TΠBd-nq=-(W֩f<0Nb?۶5~Ly~&Z. Т@}b:~)_#f~\Qywn=_M~ oqper%3Co"i&#Wvi[@!DV3[m!4pv{tύbT+֢.5*mg$Ŕ0E8,/wϒ+PJCh " sH/@V҅Bh #'Z\^qq- E{t/һK&;.ac#>myD{!J-i*Hik[/igKQ f=hnIMvR4E4(%> Ο򵁭Gj8~#̨bEMIV@,l7I1М9*cw\gȓ~|OPL9oj:zUL}fPeq}\ ~;0F RAtAY g>'j.Q,T=Izb.ju_'"T9{j}֜K 0LU\ʲ L2YΓFefz^i:x3r=T s1ܽΞ9̘G 41e3>~kTh/񷁚F!Fy*hv_A-A*sj|4v2 NP)\i+%Rx 7TE+sZ ^l*\4C/ǡ:ZKcGs;_\_lpҽMqCV*Ţcc]XGLAOʉ˻9H5 l4TM,P;׃Hlv\<˚p-A9x  *8Acp,πL4XeOIS9*c;p)f)/nbcŪc=mJS~e|5+TrA5~{> 6*i\9q]>r80\IC-[gG‚hbPAOPgU]DI׏92yY%@6.P_HCLO_UtgTA >m@\@SbmU-@% QuGjsLg>wEDH@KuUTQ Li;+ ذFHI9k"7;tuAj! j*(foK91rA){&:ɚB"iB]tb;8pؾǣq\3YIx7"VсuPh{/g]GaeTP1X(?$Ӝ9rLxfTA 5d mAgϘ;Ɋc{.c y1nۤK=n_=%ٞi˴2>YҨ#doAێ'W[k;%ߞKTbUp BIr^gzȸ=2wQ^i/H%P %(g;Tx1ZF%fl/qFra 9a{5>x+es,EQ%WdTZ '_JϾFjy;ؓ,GSwܨQE3T&viZK[_P%̱+D[=jaGwky}(?k^2׽P~s]4!LE* , ̎|Ǝߤ;yP1Ozrt Zwѝ/⥛RQoպwEP1 f.YKi|Rs$JjgB8d*.۴<5PN4MlQ )s#lB(90'%B=+ 9Kn}d.܆K XDxkNe6}nXY$sx~E^`7hbBx!+ػB\/l¹^BJP38R'r*h> 7mz/uoʛ+"5{0i-Ѕ>KHBqOgyƱo&~U"·}۴ۼϿ8Xaq!c._Txhʇ#X^暫b *Q#=ߺSgB_2ah\ts6J\ 2S&f^}SS >$. C<$6CFeZ?B3Yq^hK' b0RQLRי3vO *(9hDXC֠Ho-Х U+zoTg ɠqaXLGxrUUBevݴ^D^_0=/lEv7[¾R2qN~q$ :Z~%soU} Wy1]Rw i*}1ؙUiyioڎt o\W#AUm?$ P\+^ 띥MğC~ª`ĶL%4yÏOe:Iwl7/DgbtPry=ն8̨˄Wre@e|D!'"]"(LxǛEuhh7ܩo0S{gW6I0J8ׇٓ^hU@,>2tnt^7TAKօo81: )f//=&R~z'ԕ@^ PB"Qɒe]3FT0dQH#Bz"\%AY~F@YL~R8;H h=\( a` 7T6oT!߲Dȁ3Gw-P\,X$a!ha_o?-z_^Voh_$򵾙w7q{j@| ܣ>JmRBKelm\#NYyL'v< t7Q6[}oO*RAa2uW5aح664c9rI}$ʤo%۬]dAV3`OY$kI#C!kԓil+mVe/Q˜yCeR_f50Xn ՓEhmŜi't>ͱG ,@?xޭTa;M$DI ffEk?i&1,dcNӠd8" i|ss*rh#jqNo:B [/6Nv~CX3<PW?K:G(]/;%E̗vCʘN*Px~g` $tJSi׿QKC$j{h%Y*8p ~ (t]$ZK~*&b~rcQy-ALqwt-]ebGofM E7lFj y|gpxz{l9ߦK__@%Pi/pJ ]sEAy,Fɤܮ?v0P 9:A}G/v.| (^!1 ej56d^:s&8Tn2kt'ԲdF4ыI![x+Jߴo/?P!I2qQEv=n{ A*, !?tTC 2|8~^P]+%n*?_:d}Щu"z ]g_l49ba3OWxN|rp )c~aUf^\xIaN I|HLB G.g' D?P/1p"s ^JC8%НVN*s>G;6yaU6惺aYIJBa)ɠ)4Y6}rs_#)Z+sx`Kǭ8&)c{" B]<@t&y4S$n/I%V!~/-Xxz):-+q{(DA6d{\UaG1̠_ sԉ^Y_͆-g tn =MtSC|҄򨹧*N\?Vn082Cl_՞g-j\0[ PJ' TT@›$r Ӌ# F >G[n/_B*%jg#4jpY/!Ajh/ zX|jAhW+ _\uϾ z?q^ɓD<9TLk{}?|l׌zʨThBJ fySWn%Իzy /_~aV롯G\m<ظ*@%I~+T:_c ,٠"yc|@VXiRĂឧb5%eZ5ޕ;0W9_xyC%lcǓC$^3ih΃hGo. hAUc }q ' slx{.E,PEIy<ըeJNR ?ҩ{tӟ{̙ *Kzt\@e^#_չq{ fck´*ܔFM.$5MIJ7i?͂xIϺC7$] qa\e`]qSwgkA.3xO2qAʺnlgT\N(P_uBCcAk{5r\ X| iUr]\isֶ.Z+as6Z/̮gY[6 ;VY$V~tMQ=72 ]f PJjf _ ƐW,l4H/ٗ  FDs U/ݑ:VW myh.B<%MBJnqMdSki$O ɻpm#nW|J6 ~ ]uHm4; >˸&I1ߕUِlmM|k-IPCDZPcP:5aw"_W~ء`7;d3|!ZgWy|cc`䗁]Q6m FOp*(~P@{% /lTh7 Dh@~1   ـ x Ў' PU !%_eP؈S , *M1B; h*&z@vunAl7P9>*u6/WDh7P˾{KvY"}%b:["Dl7P _gNk}27GHn(_v!5װ{\!\ 3S߳7BQտ:o#C9@9^!j[m2+`b3҃T~A4vD?F?C's6>q}l{R?)yz|#I8VoiP=y H;Y@\3kXPj j -01oa|# g a0cCF0F170/0x1o| \ -0lQ@hAa|# Y abF7P0*0LabCF70Q=_F4]p>.&e"$ӈ&,4eIl( Mb;DYh!BQvIlPvIlPvIlPv$s( Mb3$4s Mb5r Mb#$s( Mb;7*$4HĆ(4m5r Mb#$s( Mb;J&gbO^ endstream endobj 2810 0 obj << /Type /ObjStm /N 100 /First 982 /Length 2492 /Filter /FlateDecode >> stream xZkSH_&ԶJMo dRԔc,ج,v2~mF2%nQ@K{tGߖ 3TIԐc543*PC2c0K} YI|LhcѧGI!=Π4 %-hҧp8RrJR^$9w!C+#h@k&BN=S8&UaM'44 zHҕ&<1BwQ EO" B&Pi45 aAGl#<'pp\9z)f$8MRi,YfNo8fHrY%"tEt/2k#ֺԒ41PnWǻ!j@SF #rFI1hjI K9+OS"Z6ވ=b{LNJX%v-hM‚`yyO#bJDz)`Ŭ";j)G)Њ04Y(" jt`0дvdE4Ad4`%a=Hˢ tF_98=fI9ûE.^Sr8˜RXP?NƗm"w;ɬ1ԟ p0a{(DŽϻe{˃zه&gO?}{>(,;%-3ඎe!Lf> 9<0\DxĬj3r=*.a킴xT-}I_>Eߌ 0  x@%fHQx 1P8AiϜ2y7RK?B\,u #isC- t.-]UVE=_쀥|TN(HHh1N TFw_,_-W"l_`PO&0)(U f F=Ae4xma[΀_&*%6WTJ |.&D zO~^9wmΏ[?jΎ;. )7I?Vszr80j&IU%'ǃ-wwqGMَ!#6A.0|"oJ7i0Ʌlubhg16cڻEjɫ :4~UGƅ&.FplfkޅHkBc3. i2Y(%vrI~ [wu/Jqݟi5eiw|}DiZ./ ~YD[.:XwCwv_>.[+eb ]d݃yudr5c^ ۼ m'_=AXR7 lnMpp޿;̇WKRKf/;*7 d/[Q|8_߽MNu=l#b-Fg%86WyfuRyF(2*oF+OG\15q%rK`Lz9`Xi>Ge`:zٺrL-:F0IK;In[wtxjq'X}EZG}[!F :x%sS1ͨԘfl[W0[8ijHu0Uь&2/VM+Tؿ̋C-7Uy9rh;IG:p"p]0m汵WJ -\W'tM>Pv>8YՖįi r/3%Ĕzi6"}zS5$:FZ\]dnqy߾{<K_>/JZu8HyEdXm[-ω tڂCoT٦Vh!޷K|?G k endstream endobj 2939 0 obj << /Length 3781 /Filter /FlateDecode >> stream xr]_xcxSY~$HBB2گO`HUH 0{'<ٗg!zB2BDщ2Q&'ד3"狿0qT 0nW2h:Sfo޾{{q{w[`g8-&#ƥ:Ψ7=l4" N5ˊ?fWyum/xb3%Yu/u._ 1̄0ta/="e*)PU0/Vay/Ζ7Em?Y,|ww ~.4v^ 컯WEu# nB=ary]r^8ۋrb:/"\eyeyl~X~qY`bUQ'J-%ʕÓgoJs+`Y3&iMam!TW-^Oin/2O': J)' 2V~[#hOX8RX#>P:IbJY G7D<5V` &Yk6 nh K0It> fDAPf$6ً]0!ԟ'J4MqJ ftK={5{8#D,O0"!'i}K/D9;8 Laf"@ُ?5< 8آ'7~B(2.t>.p%4:i5zO6v$4h7㄄s[նvfL!HJ+MDWڡa8@ehEř3P/3Ja],z~Xbքླ{tQdMЙAUJp`q!߳B"LYIAeG*F>KԤU0Bb.YGiGxN\0#AsXwұhLFDZ1iZ( tkLLҎieǬ]3֙Ձ2r"9LLTKʁS:JXzu_ ~Hc$cڦ /Gv)ĺ8E(NĐ bJ 2՞@e-D"an}>} m/~̗Pxv[>zSV:EP^yD7b"89%eEZ%lkoN!ɺ6Tzv;9 h3$D. +ҁv1OxAhox3O3&o"C!xWy̔Q͏d{bp^eZY0w_5 [McE bO"TŝqNeVwVZO,H6S-*U]N͚¯s5|ȽH^LJHssD4,^ h(l!9Xj zA\V_!`".Ԕ-h:B d+B<%UmvX.ÛeyfKOn{Zg?\+SP6R6#}}o- -iZ[ 6("1K:fi $LSkyIAlG`1 --U@+ I׵Z1jPE_9hV'`G ɒ5RBPs {KOT-( |~ 皀lN! EG9^y8Ji[>x w 15-.|NW|@zJHm gLjIGwVD)tux?*|B_ 7NNƙn,п\* W7!cTA\Ӌ~ٙfp? INKq!3j^[ט fuݴyLf0,9,rU\&UӌW~QYq/lm:.a:J 4]jvPs[.!)luBX9 5S9{&OufRFNuZU2'\]z$sɰnK$:۽ @ړXᖍxy~'Hjn>2r+5>'n> I[ʜݾ*Z(H JmI[͝@HX? M!9SMHCzPA$n0xjm Gpr3G1vcCC09 ɽiFYe*lˋ4FQ7/퍲CO`oW 8$^_gw=.'7f,쯺~=j Y:!8sp\7f:kW@*6Z~KNl|6ɽr1Uw/-ϼU7_-.y& lqL9?#ey{|b=}GE2yg6-S: ߽[ cgU@z=[|>nfNWV4WkZ#GWa^ yCY3hZ&?SM"= ֠ާj= 9Hȸb9)|ѓdq6.+:Ab\cI_. endstream endobj 2950 0 obj << /Length 3105 /Filter /FlateDecode >> stream xvί@|0zo@~:1O/H:p' 0pקZl%BuuUӤ</3JH. \$&9&lӗgg^Oדgx˳w?.ƻXeQ?<`SM F JD$j^㋳2dcZ ~tʀQш!T*J )qcܻuR&uX*[uxe2AUYd78va"! 0DP#R27|s@}fIbTQ'g̎\L׏*E{|gZ dN"ݿFHӄj㰹dl!@_Dˆ;67@&_#Bi^dupX o)c"ЄFxKi͖qT#'cbRLLPFepDWW@! Ȝm Gz vxRi`,@d`6;4 'B`(b3:*=aLB3GOu>mKca ַmqaP и1uZc P7jbe Q;NW82EN+T6mj͠vꫠj}ߎ 28RFK1)P=3Jq4O֩L+VeYgeWn`eDDHk]l1@!BH`8z ,P{Z"(8g?OJ?J?p񼊋2:Jܣary/z_K>YVe.<{*|Cn8-zω.^,tur2]oe2g4ǜ.t$M y\Q ܱ;(Yh8*M؎*~ɃrQ9̒l+P˸an JW iI6lN58fuhjJ'"ÈSO|>{g-?T5,jڳ^AA~dPH≧m輸Fd>^.c Zy|v_turg^ :GK#>"8JC~٢xs'ieœQG؂ 4Eu/Y1.#nEa,>w(C>̾u)ߖwÔP<$~MJ@rrV})bNE߰j=:V?o H6b@fC\Tp  Z[͘Z 3+i[T? %o2stWVYAZ)gm=igTAug&U(M~7l BF&>P=Fl5U-}l(yRx k&A?jW @/4:,YlCOFP@=1o;Ҷ]^#0HgoyP*p*#=w:GHP"&^\U-\m (guCt? N%%m  Fl's&U8QOQ/֙I-@)<("/ؗvDֵEb$nXI>c:z'#t` ԺT- I,v7#BSPϾwЮr@#fԘϖSP{Rن@qUsL9ms>mE|~~mk9sķ~η~9s:;vtD{uGKGizGKG~TK< :j0{::@P!JW:mIヒc0 ^Ir tB ھh'QUߤc{+CD$x#p]ؠ:+)Npx 933l|uw=U } =捽frEgXǕl[O~5N½2 N|`d9:F1%^k 5eщ1cs3ip0w%l6Ѫs5jɽw%UulaYE|CsS/Jdmqꗺ1iC~~&*'tH #[6 TJ{R1Ь3j> stream xr]_Cʊc :~:wG96]H) @YtO. "鍫znՄ, "g Ln΄&GCu(߆}.<9 hn{`1-c`F*^Ȓ.kyWdSmJPGI9XBu>~鳗cˆ1h2]^=Lv|7ĸys4N2K ) ª.x屬 |zS_7q]$!4H %s_JN")4_AI\ҺdMOt7"X#Gw[+|.$|6S<.ruez<9CH P$ҭB!@߾[@qu}DVER[%NFL5 clh㌴:%uδNAQ Nh́l!ف5( J$ێl@O9BK/@R>he,s|9"sۺ!PRC+[+p˶iErgXR)w303n}l*iHXi$[L _Rp_>eAif;Aʒ|RWt!7oX AQdԤ;O3k=,Jc&cMQ{ؓjD$Z3NjI#OV}v%&yd)AyA6I^vܠh*˗QXOoG` -1D!ӝ=SQj-xqH5;(Zt'Qc} Z C^{W,+y\Vw/8ÃO0&&[H jUi<TdO oAŚ1 ƕMޟ:d*n}Lk!B?LKCpq'==I(*4$ 5Lg!^sI\(\ၵ0%"HBX[axrI}gXAfeSN{MiyU۫:Y@בA([S]&N@Ey ҿ1"}R[qjXlZlm5k)c3r_թkN[(כl4r Z~;CPgNXk|m\{ʈEZSQ,t ](jQr*yom9+lW?m/}3GjS|z ~"if< Zt蔉Y.\ 1%A _'*%m# vZJn=g0[|FQ nmۭoNȿG)zݿ@ZݰIx`e_n e4ζ̄.`0U։TE'xp۶Ă+Xb^C Ac6_marz64bVV..IuU^d3v\Wن@݁5{%ɛ (?$w#S\&k3+OKh4)e[ t +\x)HQ_H@/pUʫi~he|UeZ^9BLDrXPɃIÔG&qȖ{0hTw6bpR54˝`_~Jb43ze TqdPD5%on@woP\Ҋ`Yj0LpRCB  hLeq%k7 lZKHͷ {qji[Am9a| ;`Rw}s#_bEn4b8}r՘}ruܪ{j IyƢubF ^䜉^ŵHS )*ǘT"`ōѳnP[+?R ,u߆MP(Pz)u{5.0guP7qS4F>_K5ӡ*|[" 7R&[?F'|+vU /-]R )a} v |s8OWE]%z7- ~i\w4.W۵7#ҦBqњDw'ɬi짟FU+œȰ|sAD ry2mT1Yudfa>0ƶ~L]ߏt1s~J:kj!\@4%~ ~Gr?w1{7>s1}=!-/t &$wE 3nWr5cRLw(MPBQj5Bj43'$4ƀ B@Rɿb endstream endobj 2966 0 obj << /Length 2489 /Filter /FlateDecode >> stream x[YsF~` ܈܇MJyuR.>lHITH@Cj|zhxXRloV1aϯ hӳϞ_`s2O V)b0 '"(ɯD& Gn_x/oV*8J1We7Tϐ߼>Pl{hymKу)"Ľ=,RDySQnhwZVQ'vd'4>x2)YUf G"niX߅RC"ER~ND" ֤Ά#9&+7z궻5W[0ό7f)w+(@jFjSS1+ <|5EpWۇ6~70mC.(B\Uk[ l9e~l(׋|wp ~_Wzk`lC/a,[:%SM wekEد[wǽhoxw19E^72 nYPs TY-~0 Cz2Ba5&yV)> stream xZ۶B9"x@\L4hkr>yz,tkE@-{~]Ai@ Hj(=? \MsPSSRXLD!\qy/zԃ=`_I5pD{U ̃m݌R!'XMuN 8BMx5aJOF"fb&Tt:" x^ttk.@@'bf!kjSAhc{S6b es.A 0U&kb gy2Qݺf'G:[Bjl1;"v33$R۷7̭tkW{Ubɜp/UB'ܵY-/`?ݓYٶ+|jVHtU+f1<n7CXeqթ z;R! .vlͣ {Wgz2X-d\t|+V Cc+fXu֭qtzBwIB4$Uh)3f)b 'h@qH童UiI/q`$+0Yp^xJpM*4IKϯ|'60(m}u[)*76F(l*e$6\‫z-,*ׁh(VZ!3OakQ([FAD~z(Ejsj{?JH%o %'F@G`P\;  %TdR@ѥJr]lպ(Z|L9W`LsptqONˢ"N)[\˪ian@Xmy53ղh9dgS#|,!au}Uo s{׬5M JWt;u]RW-4DU):)p -A P,v(He8:b=޺, \Bm9@c.a^:@MPzDuo]%]*iE B yT >z{Դo5&cId(FxbbFapӍ ?JhǾK2>I >[yE6[5*KyGO DۨJYtXx Ğ2EOQbPKRjJN xgN"Pr2My$$E]8҇‘:)P DPJ Eb,e. Ңzqrzn_ aiN˯ʱ X05 aQ;l @g7Z{]&keU7ޡ %~n '$s1H= ;ۿ>> stream x]Ys~iii܇]zpeYUYkC\Ӹ ffEzv}|=/>_"/AF8:^(PF#hxyR,,ow+F㗇./:%FDh`P}~tp}@-j 2,fHKxuq%^l.0bF/޸ N-ſ~(P0 "hh7 صPb*݂~[oַw-H~Wݜl AJf4+J4i лCEH*-#6$t bc9!#I',7LNQ"T8JW),@|VD$̗p V5ySjQ?x>\9_]Z6|lEpL<"aE:؍J`:+a*Wɰ6Z$KIhKkJ|Vq%r@w)s8SpL/*C"X`5ƩBJyL3L)U@Wa!`g DGVE2 PR5pgG&lHY^;wS[Ηv,foKf+ߌ1JfaҬnOҐdLYk̭Ei@JIqkZQoGbd+R9^EK+e*A6Fk0uz}i^4Sw̮"ΎHF `]1Ż$b0ػA L^Dl)I.Cg2Y \UX#,3\PM &b )Z=vmij@I$Nd'53;Q#ES3(( DU{=g3Zf+Pao* $oU`5O8 ,`ԽEĪCǽ=#=G$L ,yƸH%#8(GB ^V'% yoSI,gz:^QR#G ]E 4(FԴ"c a)2]k"3ey},:9SlSZ (3g a9c:*< EGxHc#Ј5{8@u`)O_eBC,'@**Vː g\-sB' @ b|tI6]H T%k8lzj8DG6 ~W&pW,kZMG9g3Rv'LUlLcGB* =q/Č#µuh 0hLvaA= L0ʫ'Ј^'rEi hT^=FGj/`` +`fb KX.m1ƞI/l7]`gKx3%?ws^bT>)U:1YJXu&J?aMGW's&H"dӺ,w쭺=Ms0$ts~wCsBbc -Ox[3P m9L7 f| 9PN]r(:bvQq~ܑ\[,N7`+L8&Q{St!8dg2@ԛnےSqJ? snI ty{oη'ձٞ\l͠5bR!@sjtTK] uR ۋV9-t,:|yZݭVJKv9WQQ' t-ĸ{ݭA|e$ޜEߛgwx<$~j?ka+w8{s|}|jr 퀳?Js;$y8q~#ߴPkd(;ehwQ?[oұ<fU9u&0̊r8i\ԄJΑ`quV*~a.TxՏ(ѫmn`pj'@ͫs.o.)WV/46n"ރ1H1N5((5]{%˛v 5łKIH){6m`MG)u<7m88݁ԈA'(*'^ $yIR#sWnwu0Gݕs;x)3Y[),W֤N|[ZJqGŃsf-Yz3 4*%V!mtv9rU/fR>#Z== jgյ-Xf{V<" 6k<5Z׻v?Hv!#ʕLP7p;v$ ξrt9 \{WoJRXqBu7 \S~m"foKJ#ޗz43 OlLm$9Qp]x ̦*lt zZv'*&_V 5Q߷+[w.?QP`"uPԊ#8d`J ~Waڴ]:"$B-y:&(Yj*{BeSlPku=+4f`T7B;vuV6>+JP5nl*yҀm+QT=^A{ lPPm*L5T*6R{B{PE8q̄+?^U%TOP >j#+Gm_OXtM} `v\,a1 2 vE0QM;$;Q1ums;UդqqgЅ[^/򢶿M_{- F{< ޑB釫9BoOx<@usǹb`X\6CI 9쭢M7ko nFv[Bj;X;lImYWuV/.?#c;lfZ,veIچKBvnǑR8hKL:-j|=ny4ak  Re-xe:d< Jg)2(g/0fע1dLgQ:zɞtnj7&f-$ǽ7%J'-O}"(- ꪷ>>F^1f0ФB#k\dM X+%#;Y^a!8sU#[A4ޗ7%j|W!X 44Q k@<^`kX}t{L >`m?{N&IСR=->tsT_" w^֛]㙍*>1{MɌD} Q)#! endstream endobj 2984 0 obj << /Length 4834 /Filter /FlateDecode >> stream x][sݶ~8}Nڎ&vrifzjISKdI} < Hb!֋%.}^g:}ϙ1FR|wz3|g%\#_cF$ /w'#MOG/Ow=_{/O>?}vjX-w/.#ݝ}D89l;c(ejJ>R* Ԍ\} Ņk:ف۳یn. D6Y5"Ȼ.ˣ~ ,ɧ#Z@ MQF1S9l96#"i14_I .jdoKfU>ewuɂ8dZR5NBAb\'SF%QDP(rA؉`O:hۓ:^{߳cV7Da@)YAHSSZ I%HYi(G.ׄF)R "o2[茌9ys@o"̅&¬9×K̗f&SY1H Ϙ 2q]řU>LPL3δ+\ mĺCnyH]#" FF$3DNḛ ";A%GN$ $245b.}\dfIԹ%b͕ñ"2zk^ Q2zcdDoQ=yIgN3P|i ({ΒК5TgPO!,~rDŽyD=FFB%rK[BKgf~UTMX~B}BXMZY#z~U4?}΄j7ʂ an1 UFg^QTz(I S`MQ~rrD uЉ%z<^Z7 ėq86mWzHwXဣ|a!#f9Sh$ZŒxwSvTw~D#V(:KDj[dNa1cLdq-@dV-("1 .#,X$MZwy,x[0En$jߑ7|8ȃ!U&MR>iԾ6K LLGq麞DaQ=E f f9!Yh6INA]:Sƣ4 r WF}TmEn*7@Q[ܶ($7e [g xsXBŚitBIH0{IHHx&QK+\z1[tfmz @LNդ}Wz[mD 魞Sz1HoB6+CEdӹ 3{f\oHi ˷Ϸ+Ϥ ӈl5 =Px939rx,B#g%qL .~}u'μog']B3.C\=|cgޡ.$^*n  }Joo;ۘ@& f6D"|W]KWgﺏRr{~޼ߟG1K]iX؉B}],.=@ ٙ^ǾH?GġFԆLoOrhh_vBgxFvw~wu~v{}J -nA[3 \6/LHʅK,U;F*5NpD?`RCh|.mW6{I1AĨ=-aP>ovq*~hP @԰Ne/89ŝ"w͊%!3iww ̸tWfBLf& rl/}w^扆t[cmnʶQb*Ud`f=2<{+DH쉐s{2JԭSzOgÐ{K,س.fja5)V%*4}"ddı,:B6SՔ5Ć~5r=oV}uO( f)ގ d<#JE`_ߑRffKnz:-pC\=i{"w endstream endobj 2990 0 obj << /Length 2171 /Filter /FlateDecode >> stream xYYs~ׯ`XK{.o%Nb*^ "Ak вsV70huV#T!:)Nq'mr"%+KEHD5U| ܚn}|)lMO/0`mu\`XJ v<NjDXQzHZQ| iQI0(Үl7.KB4őÃyi#y:"_Y\:_z`)XRfe](a^hcAx׳& sĬTbgGL5Ț=kcMgۻ48B]48w|ip^06y9t Qpۤ a)aCVگU`#n*˥IUSiխfar[m(%Pȧ |cBRH{Tn5^,Mf[]݃ ++kZݮHo[):9PD3|$ROHtduT^8cLzWjc"[W0 6C: KVZ?w *ݺGp+'JBc*EFDyoTSz9XRK{-xlYe$kSIKz"9P1jnUPLu;HC׮q7.DS6\?9xbK-vlY@nȻh*7TCʕ+W}Nq:^yY"kDub3\#" ~!h\5d7]ɿ5}$q@ 6T0A펪y-Y#*EJsv4)eNރ.HFG_"unEf`V+\IZNlj7N\f@N)-&){y**@c0+G$ K}c!i 3O ;/l#bɇj@f YIOd%Yd>͡OmdМP W]k5M[ ,CDRexͳRveH4s{ceƼ%Sc INħI6ct}XewM*=F|o&Uw\O>׮팷u{y>r2u\_k|Bo=ЋXü]d"C{vO-ES\(GLPga]EH 4 X$g!@rT(s0j8j=8p c_meڲAhkNve]%n:>]Q,__. . endstream endobj 2999 0 obj << /Length 2953 /Filter /FlateDecode >> stream x[KsFW|h37T6fe΁A )$h{vc%qSN`[3=_n4yNN.M#R<Z…N&zG-Ǎ"FIXL.~= GW?\k?]y;~d>qo~aϯE=kW6s٭g[~ voTEY2vvVlXd:,D.ekm+y^P;yvq_qF9~r/&X P,XlwGC Ń7x_ `& gY lEw*Tx΃"Yv(o†b`sqH"V a 1j^1VoBū8]Z0JR @Xl'%Һ ؛ն^S`(E5"D0T+w(ٶ %BP]rZpMkO5a@MS+Fu^}yjh^虻nc.Sw\3.Vbx`I᲼֠'I*,̖OӊȆQ\=7jFwbF e_X9Y2y~:U:E˵MZ&[KՒW|1s_.l㾨)hUBTD260`Q22 /fxD;ʲx{翺қu~W/Q#O7EvouNjwk)sF]ytyȼo7^**`Yط nZJYKBlRS;CeiTO{v>Bʥ~r2Z&"H.)<$FȫLNM VmFؚFF2$?DCT2bҙnEeQ)5[nA@F2~0f)6H\ B?a276&ckA"fN:ڨ ,dok,W#pzUrYu/75 ?"SAER=}mY/Hn-?#:{ynA}3z6B|!`k[Ӭu|e T,%㗴%+FGحG`8/׋8F{UQn&:H}4SNݺ- U?51%g me?1v>׫vj ܅#tcygl_Ut@D690/#^X ]SVR1ǔ%M=^4[b/=-i_bvrTftqΘFٲ ߅\̖?[I\e]:wmȀ9 ǻB2h?umq)HB < QiuKy@:p,u=E9/g]mna [gpgȂ0elIUqPp&W-l' 2G-yiT6̀te6PΝ|,in!٥\)S C+-h!"Bg('5)8HeCaU[C@>Zmɿ>>GT@"NUo`&J =`oDx+DK7=<N#)2K fEO0TcG0\aC ϥcpy4GR'ZwLqyz8}`W wܓieO`K wyN' h&I栤YkNܜcdC389/kz^=ni`A3G2 6Pƍ'T3.)](+YaC2i ě__3T =/̣g%PGjK`~D==RNk5|m|7߬8*H mcFL;;3޸ȋx釜2}ܣ;>;EDZ~nψAQ<0S9];+и_;vgN&ۼ݃r4kH$o\P++V?S@3$!4ʪCyxŅ{rsOlvl? yt\lUƘ@> stream xZ[o8~ϯI /&66vi,AX[ʒt0}Ee%"?+)ܻއ{ ߶io<빴鍧kAuq'3N/>=j?~tQxߧ_8vs@˻3Ao!EfϫKg K8 ?7.>{>pÀzYr\$MM2H[&穵}!C{4,Z kF PU_ 9N\؇9(r|WpKw-M&#DFa ^̓,ܖQٚfOD3,rõxXֻIaGD\3V _N:h@sre6mF"GȭwOg%!Eg3YZz''^ ՜?_Bܰ܂1]ͅEx4˱r|"J0O8 0rM O3yMm(Ȣd,I}0yqr*(n($E$\ˀDP#bOf0Sm< % ꪎ0aVD; s7?DgݝNDhטp}|4BaHv$(K.(LpeNg9fCmJߋ O'"+C]Ę>,=A,`Ю~Yq t$&+HxFxKg&tmsK v"5 iA {Ei%~^[5X&u"ZVe״7nGO ZGV1.aԁ Unb |y5,@ZjDx桨y)Qe[$b!Q9u`bj7-f z._&S3W8QG3ߘG`q;UQ."ٶVeӈܭD\"-9#\nŧ۾M %|cR()=5 8\Kh}21c&}=LV~>.lk˸RkgArߘ^Bmnit 9юٞLNCpxrM"o.& YE=씷EwTTbD<d9He| (ڝ 6Z T!n::Z cE\P3Ɇp$N~8|V(s=]lU]!5|>4pR=!Ich06R5lMU1cgL%ǜ(RBy~|eipiDgBndZ>jk-,k2U/U<,4:AIOB27öɮTS~$o(k7ؑLáTh"S~`7*Ƃ#y$SrNQ'jdu{~[.;*m. )wxX;|s-L^d!~8}")-Uf/(TƠ%~CK:]aH}NB'q8xyhQ6"j=RIZk~p6>b endstream endobj 3010 0 obj << /Length 2776 /Filter /FlateDecode >> stream xr8PEX^$!u23IeOr@Kń"5$@/䔧fj/"Fw/N&t'O_2=aa'ˉkE49_L.>W!Q4ߞLg*x~cg?>{s";~'"5g\!=)o2!`y,c9W* |^E^a7l! 4AR9~o0%SkD p ld۟f.P$jɇ ܀KA -JYLJE&3&H(cS),j4<-k'nP,L+x_*pP@ \V)Bd7lR]wnki8I,ňzqS$9 RY=xL]_iH/t?6E'DE&/? RA |e-m-n֎|{04 FB@͠{?i^pm$hώܬMY1Skvz b)u_1(!?6<3Zܦ `=T@yM6I]7[Q1V-<Ȳ,ֈMeMpk6IY`0 g!k! %1n*b闛rnJHD4juq\5DU૝imLD0Fw͎>ӏ+_=2G.P hUy3ӧ |0ו)̀ǻw`Cퟙ?(~,MI vAo6gS-Gg^ɷKQYBM^+J{m1$5b8o;0c@Wa7|}#!mކOHC>=!]$A2gfȳ;K]kLal,;-zm4&1Ȱ#+*<|xxgC v; )Q %9H4DxSCi,d(NBGZ-^F+صJQTi0/rdCEXc^#:|cP` oƂ:OΑ˦L`xި& .M]ڭSpƷVSWc@,fCfi { Z&G#Xy2e,n㢉.D^U] ;(*xA^a؜jd=`SK ̆nϟGY"%}~3 @D}Oۃ}9H+S԰~d ٣!~9| Ygm]lJ'c^>X&Fp_-sC;Ѣ~<9;?W2X0Bӓ,`Bx煿:ȵ͢MޟwHnpA*#y(>JD5cBCpr=ݸ} 䟜C̋|㑐( q1MoBWvNNdF<@mVoǎoOZm JOV2dj.l"[́=Y,b7%596ڰ[oYaLQɺ[[2QGׂgGHK܋be(Ul *nO.tyCP6Ƿ87ICj9ݥte[[_4>Wk(ȸ#NHi97V@6\Y K`Z5?`}gj $\bܴI/}Z+\HDa&]C>F~Q9j1A6 kvn`=3؋疆?@'{. 2PkߩYycƖwllS~_oMjQjO@ |qWЭ s_ݮOC_Uۛf]ɧhkxѡ.H *xb}UC>lnh a#Ch]u &N3jcvẗ́m#oݢudx&e04-;8__`Y}H_ ƒd^q HVWoט+[!ʶD`Pw!3b "\تpS:{y endstream endobj 3015 0 obj << /Length 2801 /Filter /FlateDecode >> stream xZYs~ׯ@p8Yy˫,%A!K9pAKUv!3loWcY5Ká㹈2ۘƕi#Bdļ//^Ԝ~sjB]S[Aݩnb/^{~x멢ULTOo.&{n;naD, #7t䳊~F]ĸdFmϼ.8bAP Ef_ltg |JSU{%eMq^{gɥd2, 14[ZK CԱ+)+9ث(T-GM|E 02!W1MB2GT*ɢFE0qCZ jɵ *%+NiyRw[9bXjT _!+ߋpU |]ΐx;{?8ȡ"]v`Ig!.vt4"iϫGꢃZa=K [L 2O66EG3RpdO*YUak!K<@gNX hA ؔP: Y&{{‡h?WMu(m(tv/S\y$RSXE+U|= Q Pu021dy5ȯX?>%Lx!},]~_E*.|.)k$ԏReTrTeo6PBwѺ20EAm gfkaGEe`^[} QCiNvGp jolw=&L& :H&Ѓap֍<.u% InA革mAźi2ޜ U>q~@MX+j`Pb?ţ|8N09CRUꚀ  .HsMnܘpf{֕B]GQ?&~XAA41V!uLV*)aŨЕN6̊a$96$B(HQϊVOIv|kzdEyVHCzS#  #C'266ipu' f{3mXT ^Oչ1Mn,[;Q7Oe@lؓ]9l)2X M p-ǖ6`mk8A2jԵ ,A^ (q۲Sd{NR/dN05Ap{Ыc!&='\\ i4T> --DDEv<9u2`'h-WpX:Fj/&v3a;*G$t1EI2cuԺѷU)VUN#{ ME2-!}n6 2/~rDl1"z.mLű^YmQkl%!Kir غ%h2S>- XxO]Q0Y˦?A}Ώ4Y: endstream endobj 3019 0 obj << /Length 1718 /Filter /FlateDecode >> stream xZo6_!eb3HRKtɰEgmDR*kaIlŖӬH?}xw#XWct$<ךL-Z2˄5^T@8M:WzDzh_O^ F drdƎ8tbg>C':r}8"!a̎Kuv\aLϓ =_%NO@UF9'agy6[\Zm9S@O;K8P_Ne=+7I$7kQB'.Tz(> у`?$^.TX/NTƬ%mN@V<4:IJQTuLhfώ7XZ. e—[e$cqoֱňO mcI Qa-_8k+9\K^j0/Ӫ\DUpz8 s$lMt_ 8tLeNmAb,6: Q8ӡr6.̔A¡a9]n`܅J~P"Q8.{9[7@ٶɻ+jON=e1 ئG'h71݋B0]gLlܣ'梗RzO Q|а|ik#|{7hCGH G#Vc|w Լۊ' M\ 4ab\-Ġ(Lr+ms59F:rLVcy'Pi[Ŀ{rJJe|:^jcgon;DڜcvI. ,eu`c%[&?Q'[.l&EfFa2˫ـx_5P$"?3(ip4Ǎ&I50{gssi\Ff0JyL %)#paA! M"&HD|օb@dKEf,ʻ{ʍ۽@̜{Jd 2 Ө[^}ҥq? ۢceKa<zF e[e. DBQ)RYXVw8tg3Ҽ6= 禮UR覄,b/ɊƳlQe05ٗ<{ipnB9)Xr`]Kv{^ZWV Z,CuMY Q6nxYZx2/osFQX"J<(/\IyͮGir\ZG' m]WEô4A+y\l2R*Hr bVhZY $o+o"4Y*/Zcko5NGBwoWPÐV e= pOjf `$}}d|,T|d?z\ endstream endobj 3023 0 obj << /Length 2375 /Filter /FlateDecode >> stream x[mo6_a' q*JRܵ{[_r[^خ-7|dٲ-'f7@93>ΌH_}߾zA !iCo#Pӓ>qnq~j7]3 N矚O@7&FDVS%RVWJ=8A0 qHT?/1n7J~,@ypa Y ^' ,8d`G_"&d޴DĦ F G4feC  (Z$r\śD|w}#zgU gJ#ҙJ4Mz*0pnQQk4EM1?%L`1 22$xh؛`3O~%>ݡ!'@b`f&&MDFt% (M jyO쯫z]WwWVjgh.䴈Mc `Fѩ)o]n1vtku\t& MHN)Q̑9op C7Tv[~Jyjk ʚ)CݾM>~y/t&5t}tm\ɷwj" 'B멆iv49dpԼI E`0q.ln2']UX /@nVՍg|a)ʋHuҽ;q#F̍xWY v3ʝ2֝>PإexHR/XK{z/I&fr@ QS-:Bq~BM8tt k!g{XFwRv"FoLwmr//skoɔ|o6m=̅rۦv7Uq}%&K1 .֛J(߸(I[1ʥ!1fb?K)j4ȳy:H .s4W4>QhLW?x<&x)y0t( % L0\J ^dl95<Õ~oMxs?}(-o⹞[)"1C}cw6 3`JﲦY7(ntm?fvŦY6ð\^bb,y˸*&go,KVhzZrpͯmq\lwj'( trgυq/q9jlWp==@ֽ} :;,e|T' D93=|HF}{vtCdl1Jgɺ|R7Z> eAn]*\Y9/6o%5(ZZ}"*OfەW:-ܪbh #F4ɖ 7r<-=`Ih"K%[2&@xCUG0?6T,J@UwTDShL#&|]<"˒46H¦ z16 ŲF5w"rF0ԫ~Zanj^t0!UpQճ^)|_n]yuxlHT1F:^-lu}|#*Pvg-6P#h}>,hIW'^r>o~dVŇHꣃ߿r}?X4q endstream endobj 3029 0 obj << /Length 1247 /Filter /FlateDecode >> stream xXKs6Wp|d49C݃,RGHT.P&Ɣiz\,~ {7Iԋf!LzQ%{Gu9RRw?^DQK hdF~GFvC(M44D;$"YZ$1?Y&$/6f<˒i~N 3r`&f 9bFdܿ3knJ<7;;j ܶ7Ia;i6׫Ii?+L3F5^i0&uSHJUASH+\4 R*bS {M lyXrV(l(RY^L¬v.Ľ ;0ac_Mu(U9V~/` DCT|AV$-bE4C`E8EWE6DսW(+ڎ$br_7璞AI~g -"\S5}bbfH1}(> +q]gƓubU̟TDVlEfSA*]H^C% l/*x"ȐOD$E?51ߚAKhUϷikTByebnՀm@GckzNC|""v8ܟ˥o83Y.AKUnLHFt%sdXrG|ķv*1omlB4ҒJiqձDnMkFE5 Ý< dM+X[d-2Y?=D"Z5Ƣ/BaW<{fAqLIty> Ir/µ9=.Ƕɮmkriml풧4Ac}4&,^ 308{~x̔i7scyf6Wz.YPv{(zUSȊ0EV_> stream xڝXߏF ~"/.a\u>uJa.L6 6{Iӗ c`v? fo_݋4OD6$i6gt;_FQ%OwʥTH0*'u `RDgAfM~Qiӗ2֭VExa=҇nI1*:Mb]ꝮP#Nwz /gr֖ɶg rթ>FITJ?ݲŮ{m^uX[]6a2,Ir*}ﶺ$Vz~`egHמZhz_+* S, z<-<$-' $~ %TT^[rp4@ B*@tȜ *8/Rq0Ь5ħTFX)!p;]~I[zFq{"hi;?|m/jX ?K$ir* D0 n 82x^_ozajۡ gbĹrb%MWWk`uc2OO6'-HcŒ)g%N[--f2u0sŽ/9 >9 57]'D6^(aPK ,J]cs@гE<Ɗ˽R8wuTxԗt!&lrtL !%!J")}j+rhwl:%A0Ss$>`кsөObOܘ /4) S%^LMSy b\PIue1O0!aZzY|$oz4C=$1B-O`ED~TLB?RFFcM]jKDkUoxxFsLU5 0C-wΆ1ᠿnxףnz|䃨6Qb!C9]M2YZ#@b.]DS9v%<|-``m!p)g|f= h>ْ+#?-pD<eb>4G)+ 6syx3roE[p{p` c暭92/W5 ;7}7qtR[p݄|Uv+ٱ^Wm4YqfQWmqyςㆣ ScNUTHIkл/$oxO@Q|J<"8I4iC^( Cf/5vk=̡> stream xX[o6}ϯڌD]=`inXaXYm!'H~)9m͖H(JwN?x$ `tOBh0/N_a脒Х0> qD?oqaBoLW..pdN<11 nc SSw3 =L dQ@"iMStW/^Dg/ՐW?gǔ^[=JN]Ͽxȇ8e{0T5H1O"O| U[ f͙= ܣ`<yBhA\4h\y5,mWݨ~WL=Nlի6Ǝ:DQOvۜgC,~0PsPvU8f4jTk|ZbR,nt{қ47FP# X8B-4`̫2}BSD6[(fbSe<+$޶mjʜU$m î\)ő56Ca9iS𙽊͊T|@G{][Y]h]Ey^-/X6칻u-x_]/( k-Z.@] B<(Xj#|чYgiށjg^`A)ƒi0y VVޔk# ޔ,6/#uy"> ( )<E5A Tsζ*չ4qadeOXn rgH`tIrj,TCW/%7ۼe`Ciq@rDCruJQ6_~Z7 )eBF@0xOhuUz5Dvl/c,=]6m0WBCwsID`i7 nA H(]ZXu0(%{`qb0UGy"PPuA-u4NQ9~Ǹs7r ]wWc7 LZMmuZZ->:y$`?! eޡ|R4HD^&HpPܬ5U*_bsVEs]WM0Xebp3#j/ 30A(^"ykF#shUGjw%؜-MqJ~)ZT3mɆ ^| ١d:KGb_gԯ5SIdMG7c2oMjncu[Sˆj}߳u$fr\NB<[g@fc>l`q*ݤ=')0ݼh< V sg>+5#'OY8?\ endstream endobj 2935 0 obj << /Type /ObjStm /N 100 /First 970 /Length 2206 /Filter /FlateDecode >> stream xڽZMoFW14#$wb ĘpwHY[^UKrԔDҤ&EX^UuS]PF9vQI|&el"rVA BT!0(7J)-W9 "Ŧ e\YWfգ))~F"gɋ0æ$ ϶ XLxR:6bweDVˊ3L^0&e|q@#^lފ)*Oa'C@,0 xK$r)+[$p.#md1< WkI&ك=LE<;E&Yo&L٫k٪@AfX(")W[,MAnYHA3eREʈ`qy l!QdXX[,QJE*EC !A/_3*1F&%,az#0Dv^&v!HVer2x#l0Vʩ؎he(&E܃Y8+@- DaI$ϊ7kY\\,oAתǟ]2/+ZuQ8mv8meZ(3h=jV!Vb cH_3;S@-n$ BY6˜! w7Z]o.Um_~m_/.׏ E}\==ܶYoJCB "huwXo_-+LzIbVgh<ݬ,V?e kmŅy'fް$<'X jCUqev<]VKsq>vDm,I8FѲF* NaM록 ]6Z(fE{I47R(Q@W>vSJtϔ@yNSph('۸]!YǏ`AEA#KqF83#MDﴕ.#m})QfRȁ$dꑲwx@[(aX%ÊkAjihFNi*t V3jC88Z$|fy<:7log-t|Egd#FncK4KY:FZZ1#6(<,tͅdu8T>-y&!#Mu0+9vjn8xhh5tGy~0ֺXQH/ ):"[-!mhZY Gv '?n?V54kd#I-p[C*>znnwv}Co/;E9qrly;d%s:;K|N,)xExav5zkV~w2@Hz/Lw+}ƁY7nXVzqYpVAV⢬м*-k/ǏQt>]꛶n>6c{pio|X_ܷ'0=l|zsL3zd%Klc+~T|llήGt:p u}N'N#砜f{j͘M:'fnc@sdIAGE9vuJ]жi 47N=tvٝd|kq.d;ޘk5c*)xR |Yۈk8^nve뀶|ڎ"bcV$NH> YY_rd\YsW<6hPڜF~sE`z0'l|u~FHuPNڧ @[]eۢ+{a=K< xaFzRDl_=#Fb ڥh7kzPl_8~ʏ?K}69TaʇIo@[ qA #Yo8pj%m tZeaE:~eM&g!9O.?ezjb:2h6';ZuOfCu endstream endobj 3047 0 obj << /Length 1081 /Filter /FlateDecode >> stream xXn6}W.l.)R7)M/n 4m1QZT)NDIU/b@*Ԑsfih,htq=xw l |`cךFz^A X9“c!bݴ^8}I/J7n}^mS{:*EǶ?zO1#TDB@E&2,4vK)j/#Ml6cQ3/}[ֻk!vTgND62XxX',keH'3^2Ba:l"z%!v .MUg INj/I&4xl=FdS=~kH֭C >86bk p$ⓔO6}iŒ,23" .5-S2bF^*@~QWE, !U/v[ Rh5ICDȬ"{4'(m 2rMk93HZ EC.Z0Nφ6VJcX&TZG"-y^%"s:[Fl= H'WJ)E4aG%N#qg*{ЩzI@@yIFx2H 4`j'.(iŸ9WHyHc#CM 0f˔g\Ƈϒ=W-MڮoK})pR_սW:ggߓÞߜ ;Wj(;*8*7' WibnpT_31/R8<8dχwksoX<3wmSqښ7O+aUi>7\_6xsH\8GO endstream endobj 3062 0 obj << /Length 1518 /Filter /FlateDecode >> stream xX[o6~ϯ !),k<5 ٦-U>$[vnVbR9y$4rB,5s6mm&t+p[{X35B짛oƯ  ƃz_]<w /]!t7(muTN \^,?g [K.ԛrK!+v+Ĵ` tвbؑ,i 1 _`b(=ɮ=0&ax5?|Ec (*DsȚ? :D쎑S5WVJ"W=3rRULP!,N>ft WbͻE顛WeKU7";;r D rD}%tA#{2+=e*JEFN6)ʰhS$?Mcqu%6Mv?j3)v݋yu)N|5B9*ӳ> stream x+2T0B˥kiPO endstream endobj 3052 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/three.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3067 0 R /BBox [0 0 341 341] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 3068 0 R >>/Font << /R8 3069 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{PWƻaU@alDjP `jJ\ xD PJT0Q@w&cqu% U֦V۷sI $W(UʼkM6zʛW'd5όYxȈ_o#L5^S8!$%]yggYE9iywoooIr?$܌L=QTeey3\L"W嫒rwAtVn~hRRySە "hBA8D D^)aFMIXV:b5aq"D(q#W45(6xh0SF& 8!2`4}yc٢>->g[h@-lo9̜obsz| D`vK1a?Z<65ƈ&9yw59t)SV],>Q}"8zDԽךNϙ ,"jl~В].^zZPٽI83?j!:u[qP$j44!1+ܺ(ދX8z&ЌjwՒyWӂ1C U.:zQm\!;ЪA|,"2 sA؂'\ xodc|3WݻqkKP̒S4KBl9P#Tad¥ZkOn_n^{ok HjKjQԈ屄ҝNq٦.!jbPu=YCMVm413-D#>hӆ noN0\k?Lro?u^&FzX&akl烝?;4XpQ{cԩGT˨e -f0%Ң:rm:61LG䆢DW!\qr`mG4Հdst, ? |]՜ Cdo|DrOEV߼js`j@ĦU'3gHf\gS?чAIB)4«.uwUt+`9ΎQ2a]ԙi0M/esD6g;Z.0Z3?[$SʊcŽ \BM ڡ)dPor5f0=qhfWЏZ xR 6æ[|0/!}bћm)>KwvhSpN Kر#pOcFuQ["="nMN1;F<LҠڮ };RE@#XUSPfn|0-AOÍ2#a ֲ'wݤ=<3{?/AsvQsݜ$yet@*͟~bdL4AP endstream endobj 3055 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 340.999 340.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 3072 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kiPV endstream endobj 3054 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/threeg.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3073 0 R /BBox [0 0 341 341] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 3074 0 R >>/Font << /R8 3075 0 R>> >> /Length 4730 /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\;2DyсKKL$^&te۲MVtpݝ g6g3}J{j=$"htRg84sg'x"j'VߏK=]J6HG:mHJٵIg t㪇IÐN8mxy(E&jxbfHs=E8E[$Ke=uwP@JV.wHA=h3Yۃ^0ri>:Y_>B('זߺzs`A1tJ68N8 Y^Fum'ׇqE}tZWߖwuGz4է~;O[kOTKmS75Nvp]Z*OҬnq^'JEp'A8Nr)%se],Օj&B'9RI/_zQVI3>׺+g68c刂oBy;U+ݡ8J.ݧ^ҫkUmJGSbiBAaF[G4vkV~z; *;z3y5+]~zpYqJ%ڻ m []TpW.DOFյZM@vt~ o?^aoU닽x}/ߗx@s9 a̍c{c_8SBKwIJ //ה9~5g#g(xզf"u@ZcAd+ ckQQ_NpX\ֲAb3fȸ5e,ޝ1ʕ27|l]ɶ735:# Abz.YTd:P4 c@8@kv UY710Wg4ȷ)_0$|v,BpyHBYU m0ZSGdfzW}`F c {}o:str_三O|}Z=-j| _qW[UX-.ŸXb^P=SqfVX=S|qzbQѮˬ^!]ϔ\F5zVVX,ի!.VRL endstream endobj 3077 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1777 >> stream x{PWƻUyNODG]yd(XS-QWF1fGD"Օf/Vm#[?]}~;MB$Ʌ!jM:7}jnّ \rglgˉgԌ@fd&YBi1-!$nn[2 Sre^>>>BٿOd dfiҵy9hUF,\PiT_AV9y]jr5d}VzDC( W"$› , `+š –XFń5eb\@~Nj$Τɴ@)SsSdOʌZ b;ws&Э\#W;@hpl !T>~ ?loP ,oꞳby+z8pa)}| #ӚKn߭5Hm'`܅|ǚ5Il>#l%9~nsPmG[ƌ2}Uq,1!k>.ߊ^Doe[塪ohH~7oRI0sUl"_M@9eVNPDUd΍ K3*.p[< 3RҤ9YjKbq:DfƱy"_z/,.]6G%C<ρq2%Oiޯ KwwEՅ W8y ++Wx$%(LN9E3q$PΕ1e" & ~:\4kA'zfvKMzlsңޜfUsBDf%l 'kjھ؍>Ŧ=Oe=cwRʖӼ {sj:a:Օnu-QϼʽҦ;Ma1k]=+yz]?,G;nnK ԉg/T^GBmJxD)=oqF ֒$?FR "~ۈHR%ЬT!k# Φ uDzxIn#O'oɬ 2Jd_"ZFydV5W 2>nAm2[1n7|yc\5M@hZT GAxM͊;~n`KdŪƋjK,x-;}udgz> 0zK?W9$CI(!싏a%>@OP-P Ă;^z 9:&cJd0k}rk| 6N͆]Q˰K/]>-R,3ԑys|Ǭ {GF{96wWW0lnXTb |*=U)7#|su,1z׿cKh7'Z а<)vww'C.o܏qO zqtĹ5\u(cj(§t43{9A ˙ endstream endobj 3086 0 obj << /Length 850 /Filter /FlateDecode >> stream xVMs0+|,-;)NKf:6p# ةcʒ ICۧSͳ PmABI$)j[AuգM0V6(vܮd"?IJ*{Lxn<P]cq:}cXżθX yQI=|ՋTܮFa -JRg ?]`.FNg\z+%D,څjU`9pEp%dd#)bG3:|g >##BXZv)#g0; oim.ԭa{ DsϭUaiC d]N endstream endobj 3057 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 343.999 343.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 3090 0 R /Length 30 /Filter /FlateDecode >> stream x+2T0B˥kiP] endstream endobj 3056 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/likegnu.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3091 0 R /BBox [0 0 344 344] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 3092 0 R >>>> /Length 137 /Filter /FlateDecode >> stream xE1 sUq$ yJ C@kf=orV> stream x+2T0B˥kiPd endstream endobj 3080 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/hsv.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3094 0 R /BBox [0 0 300 225] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 3095 0 R >>/XObject << /R8 3096 0 R >>>> /Length 60 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`l`R022Qz@S : |@  y endstream endobj 3096 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 3083 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 499.999 299.999] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 3097 0 R /Length 31 /Filter /FlateDecode >> stream x+2T0B˥kh`U endstream endobj 3082 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/threehsv.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3098 0 R /BBox [0 0 500 300] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 3099 0 R >>/Font << /R8 3100 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 3102 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1703 >> stream xTkPWffzZ16YD  ^JT4pEW+ ! `pxD ᡈ J#L5+=M]FRֽKb3$Ʌm&/cWɓ#y{3~MN$ˉܜ@"d.:XB8GI7"3Tq+7eed); (6kr32N¦@i2fv*bR2s &-_ A,KhիVQz[AD,&\D0IKK!,aEX6- Va5b\@~N*":BqQx}UIde|w0>L6 /;vfgӯa)Ɲ `o`+xjOA p y[6@4ג 8;k 6!aK#E'5l1 #l~':~K癗PmGk`Cfl|GU*ˁQ83ĚXkqFEuq*b%g6/;2GU[7"POؕq(jl1@->N :`eJ_ta60"?5]8}tE'-Y\ ;*<m" G~w^Yܛ~yN¢cr2;& :\SXs9g,x~0ɟ#,)8Ԝ+MVb1A/`>:T5K'"5Qն_ܠKsc~]K9k04&wAY%VpV$ {Y3:ɼLz=jF0;a{d;4>6pg5<wwEׅ"_M =tL EO0𢋁-M{Za"n p`3[b4)p/jM,K7;}uT:ȡƾߌ4X2A|L%PGc5>LSͰg%d^} zFS JŚ죶4HHǖx, M{Cμ]+z P6tW_4\`t$%$mؐ68c./foTwѾ[Fn>J&4u[@z}ӵoTҟz;_];Wga,+bܜP$Jn>> stream xڭXYs6~%TmBHt2yZ$y<,{. EJ$g<8lcfƻ_GGKsf ? s7E%'\&ie*|t 7Epg;q 1PP=v؉4v`2{U!L}WLO8+Y][$?}Kk]%5'KI:hOOWt\з1XƆTvH/׮PcYYEI,RO%I_9B:qeA086Rb.&rCZ Iwz 1IO\VY1[Ä{ Yu}1Zj UvU8<~&;ONM0 Y.6ku jM~{fiPdP.Su~`FQ*^jij+'yo8I{!*њ9?3%''ݦ|]\%*}rQ9~J1ΛM<,MRqN{O5v˪ZePT&ޱϵy_C7ƨOUmyN\-צm$X9XO -r¼~[2&2-xӍXڔBiHdKSyM+:Y,;܊> KĢJ|9^vWUw^ĵYϤAHCHe'[Whzf6B!!0q 1N΢ظ" {ռ3T[ '0LGbF-REO e0ݎdzZ" |j^K\3V}4`$`W#>Yk7,*)ATJt"ć y J2'8nQHA2~(7SѲ5r6^Scv})?S>K)1R"&OSnn;Wrci(AB"hDlGi`/{H7 /'jZlzWQg\ h $AWqAEwg>mѷܴYP:&+iH[Z'D4mR ] X!8ܶnatÛݦlE4XЇ⼏! Ҷ9 WEQƹ=EH%0DU@^%$AœceC>-鋴Wߔ5Ũ}  CՄ^_WW_EOP{g,z,H8Pe,xh?W6~KW5d1l^s_0KFKqG u'vn_>G&I3ISpGAj|(@eu}cXG8-Uja kub|L[ၵ@5xݡawµU}GU8%i8C<aY|3X6||8"b89U-ɼJ}l endstream endobj 3107 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 503.999 719.998] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 3119 0 R /Length 31 /Filter /FlateDecode >> stream x+2T0B˥kh`U endstream endobj 3106 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/gnuplot.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3120 0 R /BBox [0 0 504 720] /Resources << /ProcSet [ /PDF /Text ] /ExtGState << /R7 3121 0 R >>/Font << /R8 3122 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 xmLSgǟ{/iBsa p"c e 5+( RTf[ ݌2q %F'9l@Ю`KB,};䧚(L-4m)7piR=T"פ~lOtD珇$ؾ;H漖qJKxwzjԻ!|=抜h`LV? ~6ab@ 4hԗtxh!BU)xz' * T}~M899j{ޗl"٦{U-r]{8ΙwOcfǀ@ĚDy^F=X)Cf)?n>ث!3 G=C&xXVUVr[pmɮoq/퉞"Pa/v푮 *NUmd!4GIDi^VƁue) H ? %Z%z&w,tb͑VQC*$'ހ_|Rԣb$%UeP64QgSjWASF^'8Ú=Xx()w.Slı'O:16EYVU=G7X> #vCwc7m+yU^Ns$cd[W "%풻Vil5*[ћW&127mŠYvwu]'_M“$59cPa<ܓQ [B%l+%>!!;Rw;YōދJb2 H]~ endstream endobj 3127 0 obj << /Length 884 /Filter /FlateDecode >> stream xWIo0+,NaJ8\Ng_΁rH!) BZj4}ؤ1MAd6{[Eot!1G u?=C [6wecMkߪKI_^ѕ̓2OأV/~ˍ `A#3r0 ycFa=iA%qѱ7wUqC`.%,jKa8p8nakʹu7M;z $pBT"T8 dji[ 7.qSą8 m.UrEPtRH P?:Yܯyx¨-=ZpȄ+ (7h<6n+#ͣ2&>XK3(/*]JP2vF)h1t5j יZ (n1er\uo[{!ƿqc36kțql*uݍCVwdFa=نYNNGO2imnmw3kV.O>MԤ.N~Vh މ򜜠q#LRJًlI'IߔT|حw A e^g̡A03RְKfЫEYgF #!O5ilahj6^u+LxO*<1J!O0ZB9 endstream endobj 3111 0 obj << /Type /XObject /Subtype /Form /BBox [0 0 255.999 202] /FormType 1 /Matrix [1 0 0 1 0 0] /Resources 3130 0 R /Length 31 /Filter /FlateDecode >> stream x+2T0B˥kh`U endstream endobj 3110 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/medit2.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 3131 0 R /BBox [0 0 256 202] /Resources << /ProcSet [ /PDF /ImageC ] /ExtGState << /R7 3132 0 R >>/XObject << /R8 3133 0 R >>>> /Length 58 /Filter /FlateDecode >> stream x+T03T0A(˥d^U`dalgfGbDK>W ^  endstream endobj 3133 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

    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 1634 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/NSprojP.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1650 0 R /BBox [0 0 384 30] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1651 0 R >>>> /Length 14964 /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%9չ9nk$]WP0u> ̼| 51]4%)cy]|{.W" #KimA)+BP {mUtZbvODh-޶pTx>N;?7G-a*b&JRIe ˜!b u$^Yf/G/gpjz};Ř=m>>wRJ;H3'u-C3ik[ӌ$1?92UI2Fd[v1/g6l#i> IV-ml@3OT=҇7#kAZF4ŬC{kEiΉhCĖr`h b(??oLYNMbo6.߫ϝF 2Zͷdt89b`\Jh PoK)!TmK\%. zT(!Pk;~uJK.@)v_Y9txM>tV}1yl}T'ttqWQN˿%>b$&=N2 I*'zi]Y1ef&d͒qM\nH>Ѭ-j9WVhm"3CZ? 7VQu s1R^UR$?"۴Z&<@P#!#g١ !MbE?C+yJ$mƜF.ӿ$wd#>tNK6 /M/4DL畡eSYEre\I)s{ j=6_<'oJ:Z߾$-s06~$ɴI'ٷVh9b,쓈G Sיe_NѨs>/&~VJHKʣ{LCF}~"^_3-(Gb:!-˹$F<́Q9LU2@ALyDJ5L]%j$r$+ 4A5)k~U}(涘KimrSZݻd8m"u g6'd֒Mm 'e]^Iٶd]&_K&&̾H %QiGnЍ,:O 5V ǖo7e-Yv$iB%Oes"J l0t.z˖X\ȸ[X3Nyki?- |ne!+c'L9Xk|}~ cr%>1cD6KaB)5P9m>{ ]ȹP.(#+S$4KfղD.1?=3XSkO'ط5')$Y}1&h֮a=G@6tLki0}Kw0v,,U!~>Cr+z|yqGY b&g|E ]8eIh i} }__QQ[\(9LI|ejNǢ+B) Kup w;n:gAſ#G^-UGDc,rHUISb$'_mBmERs@ٳ}{D/4u|x08({@:75g=!([vU]tKP_l0SHFcJdJ/YD*Z9)]~"E#g&52Г!y@@MC\rau=ɫӧ x-g8@l!xC8% ڢbD1ǟOkzvw~ W'X}iQ_-mIʖ)Z<&҆P僨w) k#K 4_IP_3޲̵`HiFڷ SMTS&90ktא{PSWq̉fPVj}?h僉W!9JRqw8޶Y,^:>I =%ˑq_%/R3U .;mp|[J ƱataS&Oc`T$2w6waL!Xh'K0|E>h%%KgZ]SWyz WWքBfF{ҷU,#I8y Dh(EeQO괡k Pxswr0nz"f2#'>ZP[u4*ǹjC< ^TTF+^RIjmcZi#}yC.G@;&&*הމqlM6CG j)PbV){}:-+%QJ4J-0%u'{'{:H SK(/LR.8KvN'Egaxj))xe\efRڞ zEmOQX$t9gA` T7H[DǏ(Mw_y*̧j&[ԑ17h''O~نwLNP{3s7Ãi0 CοD<+ɕJn=azal}T~w27,eeK=RUTZH !6O5FUG㍠|!XK7Ig9GP,UKw9-[E 4v)iBEGtBu#7A$4VA7^" IO.{q5xrjwcA.E5k 4c"e~M8;`vTÉ!i3/j [jn}BmH_?o[kAzuevGU]S!*&b7fYMguU.tkE44|$=q`η(Q#g Ε2q,Z`FKw=GhqصtTvɸ1bn濭 W6LO@-G=1ڈ=z2>yQ=uu(#N+~EkfVSz=Z[΂Hrtmz@P4ëIJK%x3оB/PTZ],q&%YdJܬwjۊG A$q>)ڦ3u|/i<|\n Jv[w$!p@I Gc\,R]>ۻ_D28=2"Q+(7?Z@n'LW)Alsh͕VN;=Ӵ2<6 (q-@b\cm9.mS5}-Cƫ+?WG>Ěl~ݯ@( QJ2@i2h!Z_6{.*Xη:г\%!P4nJ$y [ń}!qՈsPo}fhlMkX֨2VJɋiPZ#L<, -*I.ij&jxZXTpxBPX%~~SF^D8>v(;jc` *8-Wg6*:q]jrf ݃}r U[P ^U$lR"v";lI8S)&vCHH-W97O^8e_XieZp6Zj&ŋ>X-^{mA2*,Z[<~lgl:7]ER}Q 2 ;%4@{.AaW1(EBsK6UNi}txC*Hl/בFmc}:*5f>.C%Lx148Go.ǔNut_gIMF@uKh;DDmMa~Y% وEB`Zׂoe6@!ΦHi2*lBF}'MD#YdRfNV%c(6Y`x,#g(!QyQp.9tY=]YB셉qI`'x亲j6䂚{˹( " Ax(e,VӪMpkD0) |pu)WEl$U @i@QlV/?j fĨW(\Ex}fS0C%ˤHL9ì}Ń}G_ JGe-`@xc鲈hFk A,qkbQ_I1| bsmuUc>S5nU|: WB D0v 7 %:T{QvtZӷ=]<,HJ& |XR#dKϸ\f-wx7^}kkU㶤{5TLY. &n .WEAcνOGP}.DBs 6--es 1@IZB{-39RV\"򚵭E?C{,^e Z_Xw&Zh8J02mdr(x6Elw1MZbw9m@?;~MlH0 AXnK,V,\PѨǏ2ps]}:t[K˷s.(0R}(7>ƴ&ZZ(:dm C1ֵqaH{&oދgۚ3׵Gg]o -j)! <lwշAO]i}W^=P蛕NyX8ߵdBs\gʩ*?ke Y %躕]ݨHn0 ;Vț_)"˩,.GEkٌHjM)ap~ m%eW`Rk3ys-D?HU @_疑sw&(t< 9@7>["~cŢ(|йtYav}( *r\orRhcya 4JP FP3^n{nġj) h $u\6(NC Ĝں;A31:;?QFR?n`l[EF)0pZ,;q7xI2R=J w\Z1gk!-L9.`*d-;IAZʤPomijJeg0 ߐDI%QҥUMOu)_jHu_{鸕{9]3XV8UHC|ƐM5aTU*5ЭP@'_}{RRMF(v^Ay)(! ?b[І60LkaT6@fɸM[<'k 'j&B^0ÐUj-Dv7x4nfPF͠L`Q~=oͻqAԚᔖ84fۜLB}J}Tm5S-SdQ"/GK;O7nTۓ-~kT[L ˖IWmCmESg a ośgaZٶȂJ4WVE qɑ$+TC,Fsۮ>Hd 0ɩ7?n¸T'Qy# :Uk 䐏P[ :Q c1p[p1F{Nu7Ԙ>bلP \\\0΂c)( p؃y F, r7Å6IdHeb"Yc'uG.dCm-(XmU>h)e«P_נZz@UEuw&Q8m68X)ZcV7 '{B֨(ړ7ѯ!eDhh ږzy\v"6 ֶAYfkғc”jS.2EG=F(hDau}4UI/0#+gzj[raQ@(=3ua,V5ex?&dqC䧸Q+]P}=[zmrr-αEu3`[z&768 9pԻ=`^xDe em^XaCKK0}T*ɝG,{cKS9@MYB?K2wQ:_<[oPr󒾥@my9-BɢOZ#mPݶTc(2?*h%q#3"*U^xC)H4ɫ>HoV;6T:!^eH5I|Э#@ҢDHǗ =]z OaSǎnpEZ4\fg]EPSrXSFz*%Ljw/љ|!Z@a{NOէd}Mj$U&PEg>hWO'"F\<%2?Knޖ2/ہ+hhb/6,MajΟ >24?hn,L"fW]˻6z4kE%~հA6kλ۞wwg%V9*Jo@6 yv.;(.i3áJD!{mωxіnQ70e&!;-I {޳nI\9_x큷 "(Uv^9n8M~pSC7_݋\6yFXqj-%äY2z/`t}:ŗ Cc2?w>HdtFN;&/s,yE7iC[[͸FP.%DV)];iUJv uxClւTؼ R'ykPxhʹٜ T2ڦPU&˅~_xzSltbO랿\vqd]MrH 0,\6̯w-zBxIϻBp'E!b϶Z+RNwNa8Voם2OS>[KP,pvk4 5rizOي*l #fA"]hJJ,Ȗ\Fy{խR:|WEμPf{v+ ג>-|}`Wr79=|g'&@ܰ) [k~f*0 SJn9˕9 ܯVs4+J0!%G@j S0"}eHmHRp_C9r򃾛V&gƷDUW$YVýRZ~zO4~X崬{5'^䂘|@I_bAT(Aa0n%0.\CKlRmHZ5J;Á) i0A{<һ+Znhu5zP'7A5x4d sv㔵g-fW6R`g7CjCRd36BY8WuG\"s^|F eCXk(AF-ݒRp,omW7겳ס9[/0Aޫ)E1 :GFƇs%Y13!TH:vm}SW)SßP4 ýi eQiz1͠sjH]^ )KA-.,Yo=Oө[i='E[ }0'RP7ۃY;T՟=9:oZIuD$cH_/79`H(V@D=5a,\ڦZ@sS`K =,LlʶX>7y1k6~_d}?P½ <|s ;zoE8;^}R Gh*' њO{5W(ʥ\,.7nޏ=nH`tN{IF|%9,4-ߥFϕ<ׄN={ qB%P$J6AJXxJμ#=SM*'[/1AG~Ap,o5ܬN5rS6 |ewA9;JU˒5)M]mJbsWz¹XU6^p3 ӞOù9m#e:mR9؜VMIlb7ۦؔлӸsRk6zmXaO/?zqOAֱRSWC>ղt/셵[B m÷}.|:P%e?_6vR-ˮ9n۹td|mGuGNTXAO@)G2u!u}lV2mgoPіu/bbPBhQ~{:7`.|7Uija.}Jǩlg<T۵%j*m.܃"эU,[I>oµ{ "ؗn< ;ξ™\f{y諅$M#y8AV5tُ5{x8o K,}Saf}ZXǮs2H?F{MFA;1 }ďSu-2|!Ɓx~7Ѕot7v-ݩZ-:U89tu fg5崳{ŷ ԚoP;aoSck;*R*uT.1-Fpwf=68l@JCwt]eWԬmvb?agan xEr0=A[2}MxH̽\.sYU{U;\A_>$ zy3V2H%'~Ǩҭ6CLK]6EwWj[ lBU(h>Y?~뵐reX䚒ᖠ뾒VF2- .vo,Nfj#zGVw]0]oӔ$w.4L 1שF`LrC3k6y[ V;y~]sl\HSS*G .$K &tA-Cj3*f{l@\8 \D|5 TJ&bn5*r 5xk+|0@f.E0\0ILZzlbڸ]d_W3o&Vbtp.^n:<&/%IPF7n;1zmRE\th~NzoA]ac̷.>2O*vҾ5es?T%.~rXeöt.7uSwOz4tRQ4\^xe_ xtK#-a,/zV ۵X^L]+Ko;RMu]ۤ1l{Fסw"u_z尩m|;Ԝ.wk.4a-uy\__UV$ES\G,#nYpqX|;?.(F[q~h}>Gme(Z1ʝS3zQ|hWvWtd%߮ *;":ST D,X:]![k[JJ ZآTƠ^ L|I~GKPΨr;.={ްy',{; bFgيKPQoPd!X͏GxN& !' ìQv0Gh9 < 5cBgު8 HĻ"vџ.S:΂zGv }+w\e7 FyIW\~:^T]u{FP:>vv wZ=E[ %x's&Q}uAXP<4xY?xk;܄i,[^A+֗ )hZNO2bS1j!)g7ї+Ѓ-_-m%c۬/3T|()m;Gt[#v`(؂ϩS:ڀntcho/a?kٽMA[[P`$  ǾTdf[>sƆ%=t:]zZuZNG)~lTKl.ȩᵥ]Sy4Gl:/؉+ ||A`@orhߦheK;4= 7tqC;|,WG_.f-+-P:*ؠhU}Ԣ/P 5tx]>ԽO5xJ.#yab@w~|_7: _bPl ,҅ۙhp-]1m0 gT.]N#Q:-IȔwhJ6rxJl21Z+bfF@lNZFrhH{V`2 B- rC@KqȡYeW5Q(Zj^Iգ J" ʡeZSj0K\R+ô\rX^4l\] T+x['87\\ +'h)E |&+VtՒ`٭o{[f-/&!>nkm^ayr_"QGݧh-Զtxe  U"GPVb px*3{<2!qxmAKF x`q\3(j 9TJ1@1Z2T-b( ^RHnP/Crxȡe` Pv[fxo(َլ,h-1u^%}P/ù$EeAy \/@9 u(> 9 tb ɽ2T=6ٜ!(7 #+Gx!1^u[_(9o(iYIy^s^5ׇt@IN}9%bGwx!aPZKPW#rx*PWbi)C9:u|G+TU^Z6rxJ®DRL@V%Ubt!1Z6䆖Sxj%jjw߸,*B1^7Y椈\@sP˾x_W612оLTN 1b@d5A9jJ[i?^s;^&@{ݮwx%A48 xm/~++^}D<^)oxJaXC+>)E o0Z#[V(WHڠ^Q$+\xEE pÙ24g. Ava 9,g'^qxEFCG! M/84AًCfbGP#(; JK<A* _. endstream endobj 1635 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/NSprojU.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1652 0 R /BBox [0 0 384 30] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1653 0 R >>>> /Length 51870 /Filter /FlateDecode >> stream xK(N_ձ^nx)E櫕G _ygo/~nXuozGx=ay%3C? Wl4?hmo{APkҚg [ϋZ68ڸ߿au*oC#Uu|^wim3~}~ -u[~B+}ό2ZoN+ V;}}M xMi}/\-)(q}HYirz4y$ZOQ_DdhhXn ,=_$>~OORJ۱ѩ%MDS( ț=` ]L7&mGΘw}Qۄwc}t?0xb׾׎RF >Oܧ}c ME Nׯp}_p[)Nru a V8$,APD^,]_ʹ zK1.*T3k[q,@&,wF{[,팎<.z˴}m~3oߑ-ˆ\a˹}8֩4r#K{^3|IӐ >k^]Gfc"ݿd?wcGVCv^ǛZ)VXcZwt|±࿞q\\^_uA; 蟩}Ts2G8`˧K ~w曵,Č0e`Aq꫅߈:%#z~_ҳzMϏc%zV9VSj vmw_s2 I~t̺i4N @S`!m5pNԳ3#cF(%!JIے0"`q1SFAaƑscNZfzO wK8aw h"-2prx}>ȌP*v͠*.ʵ,]XΚ2m^_RpEN+&V6_0I6oɜOr֋:7{8—R=Q;JPj;Jm;B}f n 4xżͶs6}9J×,2Xcy Iڡ/Lq ~_w=9/冇Fv\~Xvb>JɩJ)3)x<1<RR1jO'X5 z=POgkVmP.w1SQjk}0ytvxd`?Ε(hE9V:~z!zxv6"w)WNj+c/ƙ/F@Д4i/3~H_ xI7s"?Ս:v~~,uZm_ʅ.݅qlddWCct?؊ֹX.3s9 Ի>ބo~#.][/=u.*(v~WПKP!D}~=ھo)vD8IeM}wo*z;caâFx-'Xu0Ui/2,uފa1K?S6lu@uU+R`}v[N nсTRcg Ԡ琩k<$<ۖ$ VMTi=AK!A(a>&S^]]cАUj C @zu(ºh5f6oIR3ڷ$FߠTdEpІ|OE+KAG#i."` "vZqTkЄpXl{w9e9ex{VtxW^<`Y3 A?u. 7M!yٳC{]:IXM#˶r9EU?S}q3JLiv:pɶn !hhA іL|TTz+;X3jWT [/y˖m[lnlm4p[?};[Nw*\s}Juvo\G?͇ 7.`m毟д'. ,),`syhIݏw[Sy|߇|C }ݾKgFe;zJW=&Ga3` Jeڭ)uW{_ [ukZ nMk]Cqkwu/:fvFy*No9:| 1A'6&.%'N~^/;&Ť`;-XXR8 e;KY?ű̼w˱ ^(*Hv]:S<ם~Rg߿}A'/iYm^Y!g[U߮ IM]Ovino6>1,B `ٯ%kÌQ1[Zx&":$A= ǰ dXQ?gFϔLuXSt1]̾6I(K b l\?)\`[ԹLQ h!H5栓-) Pk0*c66d.*e`+ߒA+r9ҥs[ʂMST91z{ZZߟɝ~>Oiy_yk 8Z͔|{ӗMBѼc4Ѹ28.[s=s,ޚS5p[fG^3} 'Al &N8#)r(ܒ\q;xJEEARA c:VjC*VPgh— !)g`"` 8?SDq[oG(4}o/5d[*m ؏o" n/K._=:{w#!m밋xw):KbZ]aI;޿#|syxDc=8ux̾ 0@$wWi_ ߷l[WSWKTxߟq?Cc7H{ucwxgWӊK#OgWpr w\az70)vn<¨ۍU+B]Lu ʑtJ;W%m{s;`@gti;~)%]ْ[{e~mEfRz)lY} )} ׮/UNg C!&+"##Azp],ZF3['.ʬ@fABeqyy `y~AV <z uvXxn-O˓֚Єj\0#,470 |g?'=4ݏ?uk.e8[-+ˁz4A׼-sG}ISî,7]]lz~$GjJ~v 1|7ӌuO.% |;RLL _.ICxIʦ]]*7 ;jkσ)g؂+6[PD`N1tڮ y<##EBʅ,e]i p"$4jJU @yE$ XTmxk_xxGη7h`hGn:oI=Fr7fLv?bjRʒeVbRYiKY.ْ8% ?φ?XAc %:Tx/#鵧DyVhA Ef}υ踹*殻й"z6)dP>̀29~ I\R}GjiyGSd4I #ܙqڐ}>_"w Р1a^C%D[v/<-*~bl?-BC X0/(6wv!I>,ۀ&>ƽV"0va).u,k?8fB.'} ˠ]'haB0~;Z곆[g ӹ7vzwqOU8/[bVMb(Fs}[wM[UO!p\GX_R`uyH7o{b._o5U(Pu?D]8.rSa}nqpК|!V R$/y G;ǘzTz Xף}aTOнͲq!A%PUgoG+R Mj`eK{x*G.ӿ#xeMDx__-v ,}F;؉BzIns_J)m+B}oSU¯ï#\L1ʇ~ZQ:.tnn?(;4\ݥܬzIIHV,QnAPS  ^Z;eܖ]7~"Y/4u BhSqžRǧ]A(w `.%\dÎ]6 fR:xg5|o/gV> _( }YX|lb+Kv ɇ*KL]5'OX_-q_E|dB`3l=|9==ˬ#odheN̆V'"? o QN(Ө" ;8ԗ>A:Fgg~$nDGo˴%)V_ݣV.aH0hGGbiv< 06Do=`HCҐ: i(K:  Pp:Fg2b8I 3]y>DDNt=,waS3c8h[c - BkOBF~o%AS{Ѻy.O9=czGش|S(iMX6,5UIi\5*J!'3y@ϮH DvۘԵ̖r).xnD$3I5$ Jg%҅\RE)TZ5甭P{Ke3>< ۠aC0ԖV*@PȲ:APґViQߟM.7_U72C,[ggQ[a9!%D?A0ɅYS-WvM53tLgCϴyg7*jOgmrA W$7$o?HM(M\_6Q7yeg*H,0~5iVMsT"92 4*ZrL5 1M_AXޏ~eMj?eKh,}Ct4 q(iR(@0..=K@t*5&{+/Jf_yP"8 HNeO-~g8ɀxZx;)}[° m4g-.sZ}Jm4\8NKr# z㽀x1rHnl;ß-K܌Oё1w+|,a@oy6!b4a_Gy=< ]n:; aR tFq.Tkf24vG캸$߂M$U -.qfz2=P'WrQ*l\P!fe mV!(lE ħ.]WL% _V0ԕk> FL6DRمLf[R8S9|'&#B~&9W'2-5t^gRl?XkȪ]5d5Lg'a&>(Xŀ"98N8EYG ;8! ET& t\/ Gs>aX׎Kqi9/ǥ[/HZr :/13h21:4Xo(R61ݥF/(oy6?[ PI4C/NJmI^~{/*u[ʹJJW~[c&# U%D^3ArRsg(O+jVRlQ BV 5,d<&{Y_G ,)!x |dj l)4 luLC9/-R}{r[#f/&" =2(?K փF, _(";O*`0#ֳjSr$<%!1,mIHDT[b C6@ EX.82wVkTVcby`k`p/d|(xRYI`Zwt_5/\ PouK_߯W`5{+9X[G>ZoG%0N)SAls`mH7~9qcfi65zMd-D^|$_qq|Z'L\RDxD8QeȼZv,#Ul֡K'ۋuH;u(؋+8 |pvH>:*U-U~Ǹd@=%G|!,GBXPU,@2UwAm.i%w oɕM-9ܒdۋ!}X?#%P"FbX@g@& DbHTfA yZї^fx;UY>wYn_`xѼKoa96*~v\ޟ_Çƻy8A$ΠB!ycӲCOȅRT@%?if'ܽ{^a)JMOډqx/e`)X E~c  ;N"L! SEq6g}fi"LfGSQ2*QvWìGuouTugMݾ~֣TkAU+XkKU_7<*hypkIܸ 6Q֥%)zЏDgs㱶\(x/fwoT>Ex Z.mʊLҼ> 7OsC !eڇ;=z؈ +/YzV7t ˧)OA^î@%+.-M+O$ XG7e[;`_c M 14i$d'G,[GPRLɘlbGmiQG:﬎4fiD-χ4]EBf_^xYIYUk/Y"RupRQQUm$~~[`w20>"3&okeoz8Zao L[5@ƇiKS]oRt GGEjMն@X ߛ_*0MѪ+A2HGzV>>+YcSD=?]_|v=ɢ' LȋE+)6\rd@<30o{M+F)GʖBy$y"iBy(m(/zѴux[~a1p xJClQ0No涷`zxUbo![ۏ>!Ch{{*gB7}9qhV(­ խօDwg:[N+mķ=Mn:ؙisXļ,0Sg9 r <'W!8’=8D8i#b!ބ߄e߄cd N`b%RSrΆїx;/5, &dU3MT@P,'`b奌ʷdP21Z մ^n %׆ xr|mpI -<AHO5~XCҒRHD{izڒQy Ya4/$y ap $uS zOY=dZLyN&CR֠iٲ"1]6M|l6>6mwAp|&+v\21̸sx*8z rh@@p͈| 9X@zoދ8)؊ӒLG _g}t-jyf9 K̈RbU~R}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< y%̌< 7TKTA!vaSmzLfKÔ!"s5@41"B4Ѥ40D\'O:#Jn/B/7r O]^䨫Ë2sas0S[.& h8sԋ6k+ _҆qUOm~W.|! t܏tu؏kK-f7D4{ ((?Dn /#)URECZ %w  D,^a&arK <I= KI T@3 @ PM* uqL:g6YB – >+ |O L)ULF*)UUKA*dA((*^TPT|5%I\e!3zx}{P3}Չ0rjsӇ1@ˣ=|Uo [g^w^w9S{F®UmVv ס'7+Tz%Ke:,ʱX"GcLEFeZ4m4N2&I &\MeLW,.CKj!B Pޔଡ9(32"ABϛl<_< wj†/#pxGL/#eD$<ڿq\'@° !P!5pX*/>Ӏ;( W"V;Cu4DK[Ƞ;R,qnqFg~mIT+ejM6q/J d2}r V*TZsǜ|Fa=?e xi-;^l^-G!!AG8t:s/[VpZB© 3GUV:6-&!mH!bQђٯr Uށ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ݽZn'7M]Ok6˛';HGHE/Y1)uh]ٚip*NkUV `N)\Q sqo~SJJeGui7 m>r$ \WA`ΰ|S\Fj-%U Q&̺%f\I5 @SҜm+rCwN4y=cNF|}aJ +P)bRR 05<;.FƘ.FCMЋut-jFbRpkϠ6a-;נF N?Os8`[ȡn+p5JhƏ]|k9 _]z{6ca͝n-5kGYMz=/zzU!mxz=Qu'1jCI -:"Q#jOO}B $"HZSL )U2`W~Qb^[B+!:x.$^3ZBpFk%W,BDd銎Ti),\Y9Q a|HUے.5Rê/y,`lIFcXL B`*)T.l]WK?/:\(0dujCʐ1vbVYoMQg؉]bm"Uܦ͉gzw+1PWe Sr@GlL`@F`̈́. 3U0rj 435aL)SJɖΡ"Q-Q hJ$W|H2HE;jc#ccc^+^^N -A_fUC,Vϱi>&lLm#+>vn×<~+3W΅/aE(M&TY"IeUd{k7,M Nd7Imo%" HaUZ@~1zDd{8|kOވ4B0 ֡)0+j,N 2zv.[FE˶ #Z:&\S+cuj#_TՔ%OWas?ϐ c*-jF@B|snRtP^?ܝ/EAk/z 5B|`m6Mc`V9/z8; {]I3vW.xVW{zyVq9 j0k|ISՖXԲb& <6Yv;5vEw]1=[]0Rh"TNIq%uX H% GV= jqC?·?n~%n?I%y{E& pjʖ2q⨡3*2arR{YܢR^w҄;iBL'NON ̘!tre΃wmN'D\z:p-[>\3'oT#*1iKQe欴I.OM;/ܷCxˎ­EQ[Q!<.¢RUT`BB)B?פM;a_OeG$KѠC@( 1WoEɉ(d>|VxBApDS+Mo}\`E\uB%#r8VԔ<bth <_Šy74kjuKe難h|Ƀ Ģj33**vAp\aoKv+min Ab5򐊨`UI. =ZP)0.%10zu7}qόQ./bCH%>g6/+x% >>NHaBO᰸'y@A롙 #f Y NckhK?@g@ nܮ>o^HCSg/{_sVʧN* FU* @B6iIB Q-^8V~qY?7_q<@4wcGSEac=o}}ѹo~t7^؊!PZo5X(2T{@d(If"C#P+9.qMS?S'['p=?CphKCpL8R!]jS Cztkbr$ja4r" y[bveY]}5AV`/Tmߗ)"7pM֊a>(|&%Ag>+=-GAhD<>'nq4ni$ enhjqEpcБmor߇@𽃑L%/ܩH6PE !q]B=nICȰl(oҁ[TKR#.R-SMn:ST~]s?UzGbvbn/hGȡ)C 6q6uI7;2088 z@t{@~h.W)IJ  <ExGDM ڍŸg2ne~jkPh7㪭B!{m[&].#"t}oCT{ڰGQJD(;jFYFv΢3UQ+CDW䋶;zxӲ|—+ޠsVA HU!dXNgÇQ*-Ox]m@pK*4ד\AK Fz}ϐ::qAJ.? d, H"0 X1t}=?$R}x;(NjdkG`aɿ7Ɗ>im0 P Q3F6(}n&) 4Z6}}c}qc $? 'dX YV2('v%^ȾY6S?yUsyr()X4p(V N-dI;/ Gw#[ہ{cŃy6yF 9Ȗl Oa39:㌁ºKe7J'2Ksxcl% oOeF{̅2A'̹Y:s La$KPeA&lJg Q2 --1~9aKۮ:jЍX\a}yl1rM詢6؍YXG`7iي,ynꈭrݬJ,c2L!{<|x{c]"kHUL.p7(`-#_Ae1?;~?c=aG;tx(]2%̮+ٔT!Ïyy5߻,!"ݺ S-,QR 6ҭl]4ZƸ殊/c`uOr1ǁw5bRmObgdc0&"F&s~MX:ōdtU|4`ʮEVnLK˶n_E7>$;)wܵX< HN )}nR1jH1/ZߡG /| wRgG&ðTl|‘^n$zvy䕐J(J; tiu]c\q]'++!w[*cFk7[s' "lɯux;#UX55 Zg4$zH{aYZЃ@՜/_v1X~a?\} ɕÐ^r0.J[Y )s?O_am#rs#rZHdFE+"wFXgb3:nଣ;(8؃*_CXU\C7U5U`y A% 2Ņ{4qL+#+sI/ 7Lj6Ne#ɑS(HJdڗ8xvO #Py}bƞʰjaḋTx*ܠ>37xg6o y!-_[[[d$J EX4;1/X%2@'$ #BCٷ}f=:)iS+S Զ 4~9_~zx&#5[Jo Lnmnh-9s NV:R?^i_p\HZl&t磁_h`7&0i!۪6c1=rޢVt\Zua2VE.|i\dP7|K_IE%q?\$ EB\6)g5S\xeOlgY1sKyД5:9g/E*Vr2 '5r^HL5q{sNv' yCǸ0/ RZF{ {q js1dyo:2{...X~?$qK(%v͟vH(2@wB֞dx3څ#DfkfӘC>V!8B֭-^A"d"e p#s|ғs:y:+y1OxshfYhBs#O!ýS5ߵӇle\.>S@z- =EO Z=}'rQЅϕ o:ЎYn9cCJǿ+CZ8vA@CɘsO dLޓ15=.Z2u}a,V3{{dX _bCtR$^"Z}](2z9)uM bCEas w {F]V~.w^|7N#Ç؍<>nȽΑq{!@(#\ l)&+kpȵjwjSܨlVr Uv΃Z[ŃidNDa-a!DkGd8J!{g͵l[9ByAG×3{pLTzǤ:zlzɄ/x"قWd'{raї~Q3طAnErF3-طw3\/@Pa=8mw{θo9%? ,vԳ(@0}9LH\6N6<jM\=ÙH6HΦW8s#pXGH?{c* "8R>{>Fڃfu"h[wkc&CQ?KA:—Pgygª &G8 a t}} 46Ris0}u/\TT]׮>$Tm7xO 8PC,,3w$@DxBtI*6>%Ɗ :VK '9t%`iB@8 X8R &,s{OИǦsX@pB=qEvS7/!Lȷk8aBС0!oե+X.h6C H@8$BtQȱ/nLuȧPha[: iٴ- !qRUX.O^\t\87P{GQJ7x# k(zqEȋ0t nldj m;hJX$'2[r)*idk'2q]5 ޣ 7މ0Q^4q)@ KQqoD$ *{Yvb ڷ"|I^)z7W+}&nEZngj#nGdTMhp^$*sd̑ͧp Sh @Afmz#U>A976!59]?GL(tHl[VtuVZ'&cuMw{s7ښ+N78clz .ey\:2=пȈuz'g!B @R1fIDSZbW$w]V4R`t~X0cciNVi$\TrRAhؒd$f uLNe N$2[Gl MM,g dt,}qK"0n`c- f$䌁vu11BU,Α|Eb&Cy$bp @Dh*׌}{9krA%ǖmzN(OjٌF "~w\a'@}(b+379=fCHz#!R,9HX & )ۈSkVZCpeU GOô#2vÁ|0nW7WO>I@(`pvH|5R18uce+h*?ֈq3ʨq +T y1bRht!b >Â[@(|]@ӝQ$ç&QwA""axhÚ{tZr0777/yΖ&\K a Ւq<%=駷&_/]^GdonK_"['_am~c` vz`ٍ6F$o~dAR\)r INzNY^dpkѱ.z6=ni# `H?l|_>> ӧ7mg\/m'\/mg\/mSﶊAT.ޑG==%7QNbu5f=ӶGA?mKrmգ{ ZBStLtpyN) t-~!2u},Gn@ww ~7яE81* a ^>IJJ;L51Dl-"Ov{:58" E=:a63{oMv=֦Uazs,6<&U@o 7MPBx]j)(n>2 u;~fUޭƊqzcf7Vܿ+YGŐ:X`&a*ޫ[ Xjy&qdMDaZN%ZÀIJȀYRd@أfI:K GŒ 3LfH]1@Ye3 8GE! -9>qLIt—|yGs}+'}Y䪎{F_0@|8B"Ո@6Ê#$\'6ːsʢVx,W=21g2 P p\1c#t8##5ṹ$5iҮa599Sk<+n;t}\G>$9=f l\k ܌^|l1Irr֜{ҵӵW~rrP8`H]?%S3H˛/GF |l>cY'd+Ԋd9L60U6UsGr⪹J%?#8eyDaǵ {oaSt ,&ir?h-VT頼y*T5Fy,yR->ݲ-Fp;*/qjΪ; (0xYM-QWOfzYdd6;0_J6@mVP*LB0c|Ȟ*,L`&V#cڦy Md@֒c6wC}'cAl>; iB;,,챒|5tږW%)2`;lG'-#or-9ZJtWoe՚ zPǕ|hxp+7͜&_W1L<_ez#(R@OlG|0SHO͂4Q"zɂͳע*g5w\ǝ{e7qaq<3ZsNUnf> `(;BLwQX0Y2,|FB5z$/*1{%zwO!*JT</n',~/[~5,[~קņFl^Vf޻->N<.{^vν;IZX)~p A]lx@Ӆ>HwKS֣G#%w+٢k,-i E+4Րˠ]#A5 J.s*} x]` Ki$ĩ.MK2UqeV9!PȱӶ?ks46OMVܮ+ /Yb\- lcW$ ST+F!͖v4V}: ~ğ_O~Էdr/֫,wOmVL=^?<7 e^Ǝ^O|s% hp1:5Y`j vөatjs>5o/17rV͞7r+;<Jw` 2y2HX'*}cRP" EPm]O5&@ܲ9́k@SHsF1H5-蟖$P סRmj;S!x##\ix! +t7 ~>s&i \%DJ ~\cI;98FB #q1VZˊ뻨jI #FasUqi$,.@0%ï1@]xҲd~&eKrW]6ќ+L[ mDsgqo啞ae +FWbF{Ǐo^r/=-R惴#Ę)Pv3Ҏco=yXŞ-.yiXe9KMW\}6͸>IIp (B\;-Yd ` p 4J(9)r92%,w1bGXT]+Pf`':15ȡ#aƨzoV ~PĤ#bRN&Gor'o|#ͤZQVwM[9zA!lxi0'9-Z;̉+Y^@4ޟN7ys9Vk.D+Ar)؋ڀ` ܾi>RR󥇸eD̊#[G y]/S B`Cz<տيgT}a;H1м 9XM Ŏow@pߚcU)sʮ*c6jMrx`M|]+vhi25t򑮂Eu]W> Z[cUЈI $ay)Te&f: Y%)Щɾri}aHg60BP[O'B'r=MdzI2L8)Z'E0`&-CICe a{؁rvʾtDsHjg_p%\yV϶Ipy#+[)>>P2ֆ r)>:.>^:Fzj [ٷ}7;mU#yWAdzA)tw\A4qpMR9Y[Eu 1u-\ X]K"0^o/<]G[wa.:#9j|z)%V$TT[㞎ȮJ %B"jj+6ShBR!^:K'bcce~ ];Q#];tDtpeԵ^TI336᱓}Re44 V;λtLNLNl@'4B|9 U(4GE8DfN^\qqudvE*}e[+an_o@#̶76mSvI1m'S +mGU0m݁TwVnmh̴G ("0ɘ@G {cؔ35RH<"D`{AD|Up::ZDN4D(iV%|ifp]r#2O]ljpf헺\lVI~ϣ"(`({;0ls]ǚ^*ILwEZ_zΪ5 jؔ{+:8E"lo0an8퍁(+?x| 3>8XbʅXbg6|%FzϼDsKN"&3vZmwM ׂxժ5% C$/͝Y9yo12޵f,)ʮ`?\W)p)gzcsH׻[*Ήc.F!7G 0Pv_feʭSӌqQK6vRXqiO)n<).zJQh6i[!iFȝ~8 A0 I5qNBǴ{[(>j8{!r<[9NDHZ9DZ97Fg+c+Iqֽ2rLWzA)/zI:AH{6w{˜[&t4RehaB2Y} @_pj=p;Yj$ ">O54BA;?Mv5R*e2fR_'Q2-I) ;) G}Pt<)k JMЦplE&pF2T,H3ek+y)"F:@2~FE2ׁ#S]d"Hs{ ݢٗ<2Ml<$(==1 *{fUB("}ۙ˺Fn,3Dln7{-J5RGe9Egw VxI7·gi2^%58KNsEOӐ|UƄ,c,cTܱޟwٱFuZ"5wٳF\N:[w86f$`mr b^P4 ku|vX#,;~5%bKhKH_֨g^B#^zI0$[RPKxM@KMRGf+㕄Wk軺bL0;M4h{hމ[$f '_eaxM =j<m`fu,ھY?R k@Y@5Z! -=g̳HG빾>r$}SGx4u)#E#XN `j"N XfjʋxbU7AH _jvZB~ȫx n]6P. W6ejOCN;Jisa)fgdV?&EmI%&D(EKD܉ZC_oG!Sg-[޾="!= ˽x)#?!55mlO;ʟ Dx%r>VP s\I H*YP$DT$D Y7ycMs B 5y0IAFkY衬Xdł:R׫,x=+z`XGSF(ud@cǂ ~,5y !O{Wἒjү#\Ճ_txx\^?d{khݍt1^ D0n9znw1-6 BZU [*FQ rE?/Ԣ8 h7?m^5V VlZnWLjkbc5WImfp]e}Re\6qQwrLedZt)XQ[#8vʌqIBX4q ŊClLJc] 9:u#:H`U{F^Y_|jqRZtƧIAgxj1^Dc?8 G p21)]b<&mP̔Ƅ 3yZkwNOw J*p@<(u3TfN*5O>7woy^ ʭiל޲h!5@kwń*e1D Ub/??N66F=/!^Br];z V1 k0-r%C,.,R3mń2D8&fb|3).e< SK"r$7H,gA5xM0*RE |H,#}RiPyweAԹJԈa bİĈ-xcS׆ tLX F6_:LW\8J/?o G%L~LE̛c'a2}0Ǚ)H㌃zAx٧&\{}sQ.];zʹt`IS#Tz}: 瞟{}^Uڳ]IN[G ̵˞QQ>J)!GYֻz7[c濥%_E_>Oa.J )͢C @}<+h%FӘ% (S`T wfEׇn5@ ]=WiS"։W:94ffp2>FOvvjl}ݸw+|X-.rwqQ]dU;p^Ur.D" wvNvggUlW}J_DػۥJǣؾJ؛; |]e_(tlaVJbb|UZm6zSrSX64BG-U6)JpS^_xsu@i^hf:yCUw xb"2i\uY{. hɃ iܘ Jۗm;ҹ&iDE[Ev.%dT|ٯd!*Q&@qa%: FH^)eRU 3Ni5gKD}(ϓLٲЊ6ZϰyװgY bܖV*4$A~piFތX4LdċjIxRx3g1Aa y8(K`CԯoL`:3Mjtg-#󌻥;}7d'fiT˫8ѩTk D6D#^_QRI_zz H_F툿v$} [Ɏv7J}8(˧%xr],(>KPqV-&zUVtIIy>ۄGP &kk$kE/?MVFʼ`I,T남xG>3eĽXWDK ]-K]@٪ޒQ{({D얞65EwI3z-ojs[5 RΗ$4Q &%]#[XR8^m;%spRK K?)x3qia 1>}V([ss̚ARf;$@QAz =6!d(avne;gv?!΁P#vf"jLU %,2P-+Iiț^VCeNz  1nxgM(oY xwAYN}|DR͙Ŋr'sJbLD>(r%7xSN[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;3hKrT?|ޗ+ =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 z7@B7wA=+0P:?[" j?3^;Rr/9Pw"ubBH~4#«P-ƫPZx}j<^*BXO.wyPǫP,GPU?]P`<^:[W6VƫP[#]PhOx>Hhv?.v%] GPڀUrKĭ*i uEWNmUrΑ.ǫPϲ@V7>v'Vr Ex4p@3{ VZ*oX B@Q=V6q*mR?$4s=[ EhV B+PbKb *![s 4'Izx hh@U^P(+PooqZsݚ1PLLzVS=og|&Wպu#[n eѲhlFxЮ{8>'ىN 4[wIޟޏx>62X(_[ٴ_ec)glsPr>gOxJ12;,9(xJ\(*"|r{l(R(ƻЪR](vN.ܬ"< Uk]Ph5Pgt" h')rnf\4c" T(ƻڥTEx CpEx>׋. B1G.WKExg1@v}kѪt@&0RʥyE:]{l,GP+JP:{It[(g91PW{*T Ҝ͞*J}(k&ƳxBs'<Y(g>Ex5мJBy u:Ҟ^WNֽ{(Wc})hƫPg᎑z^Y$GU«P%1E«P%;(r"g9(}Mx*$ӬXW endstream endobj 1656 0 obj << /Length 2333 /Filter /FlateDecode >> stream xYsݿӇ qRmu3ڴU@+kcyV2p%]:tZWL,/`w^wp//~MTA;7I;2Qs1\v9]]|PW(Nlo/{q^$c}q_^>_K?g4'1R""% b2^7kf3&(4yg!#Q"1@(V 0 i!H&$f9{;Jp40%D/®}w.- , ĺ_i%hcC8 ]ƴ"nTTwz:M-&DP E:,GR%9hm-̒ :iߋ K4Z,hgvb֌ xHJ(X#yPl0mLG F %mCx]@0JdQ$]1);TQs(sMKɪ b Mb  1ϭhwH}BpS7z2]iU!C $蒴=ƧG#ȿ=u jbgK:CFOLMD "Rx\+^TH0m qp-Ji^DLj Ѓ!crg +HJg^߮JQHМ.CC@M~̻V+Q[W"1B! v N@lֵtͶ< a!2PI-}vXrBeHC`Ude T6QNERgLY<܇+qЋ^JVC0Eb#36=Sp>YҸLg*fTe/ϰgZ)5Sa꺠 :Ŗ0D} ߟ@$d>&G>r@s[oЩ7 EX5~LED@fx[]>Xޠ?TG9kISP|a vA6X׫mQߴ黵>|ot.Q$W&Tg{z=&_rHEH@FWD-2y7cAhwEec4ʕ6dc(2ޑ 1Άx0܎NN-DztSKArz8moI Uδ.'ҟlh_ޓ=5_knxV҈Njuƍݫ\oGZbvG=y:}|7xHyM$]K߿Za7#/D**qCΗʗCp:e^"mu+IOpͪ8vH!vXdόcmnMb6*mx^3`խln0$X=NF:Ȗ햩~ )zB]݊]i^̵ !݄2+xqv#}|,7}6FslmSWzq{U;N\ӧ{}J-}E -^X߶R/n׍Vm"9 Zi=&SV>_.}~ˢuk]g9핳' endstream endobj 1663 0 obj << /Length 1624 /Filter /FlateDecode >> stream xX[o6~ϯ0dMR.h=]ۚtuH r,Ԗ4]CER{TuHw>t0K;ܼGx=_; 1M;6خauF]@n[{5st} jw? Gսx ՛uW=7X0W=tGﯯn{A%g[#Y|ɸٱ qkQӉm Sĸ;hF=*߾4N bhwF^`)Cؠw=PPx6|餑+Ͻ NdE"޹~nn#Z=fx4>R- QUT]%2~aN?@ʵ' PYVG5O3AAjK-6 $DTs>u6I$im ƀfAa\lXMb syk:nڿV"vAxї{J0}.<"bG{M/=[M)E| #n og,XL-R<^Ƒ.e LV( ʞ{L[k9#19gxR㯂UtZ,r b!3x6י{Ks1 >,}_NK͚HNN͏u*;/ =Dz$*dFgXSS8҇FĜ(F\_eY'Y -2GRoƪ $ЭzJ% ! q9YDUumVp-IwX3dot:> stream xkoq(\!@6K r^ Fm%!)'_|h)QE\ggf3 .x3J#,8; 28[oC!g1" _ ןN_=}=s&CJ/>'>Uӟ_xўG l(Q JZ`>p13Ut~)k&=_s-?5h'Tx`s"ML08"bDH Yv-Fy6׊?奝L6K;.S+؛agsxYd -u-⤲˯ϛ ղ}nesVf%v#(qjm.,RQ$k;rL opV؉Eȫ (Z"OΖ {6 DP%n0!9V2eUl]Ԏ.Hji_%v F*ҥB&d]ך?"F<̽wq`n>oցBR Nq nnAUln{68?.RPHt|7@W'g(|>G3ѰZe&30k|3B.lp52]Wvj:-EZ}ig50\nWUi_͢jUv^5ʾ^'g09c.zl!^yeQ" o%3iT\;aVq gfPoz¤ ~YZȏY=6RZۃ\+Gj-',MZ~pE-OƔfcWjGޕ\;$@tOC ^=p 3a_hJ(BFpw}@1LPc~ }="i=]d$kERkĜ18"%#&U\i16 %7yhC!]!ى#;̠Q:|zYS"Ppw;[&i4 .c䧞 `2=Zj۳(@p"XѷaҀ h e99E vqDx߿tq՚2 g{\X\ց'syk5o#!nD\tp9ŖtD1tFo@<@,\S3˨jiZ9qS;,b03%ug 01k~!m;;1=l?/9`$LW,C9guY^5tI>?G48 zp1"Z^Lޓq Bчyw..Ho9ps_:{7!3u&lȿ:bo; -M=t0UO3>E "&ֳת00{Pep q kf`THIzC +^NbHk끌HdDڗ@ t'vZjFO ĐXFiڮGXGn=`~Z]Vk`Ԕz).Bսv9s n+?:J j.72+EZe$/siA7mțcC-jsԟA[kV~_3ޗ/)EYYeW; ~sZcI;~aOu[]~G8!V?TY&@ IB!`TYF\Q/J >@U$@ {hhm0)1ʦC#YWay!JGJAF^6=Mjb"pSꭵhHf$n9ѝ Jc}3G`#SNqGPv4w39Hs;hE0Kk xM<vFvq/߉jmݸk* ,:zͧrGX@BW5>Vo{cݏ)=p3;;"E߇H}+WaHUO#hVc]6HGbDcSm9f"b&(6ꟴ3d]ΜFZJs.pCJY"+^@{,IWE">:Ek; :Rb1SBC5 #XOVN)=YOr"{ DڡHx w4&3wQ-HJ]`~ 5%pkz* L8p voɿ,_ c endstream endobj 1659 0 obj << /Type /XObject /Subtype /Image /Width 768 /Height 512 /BitsPerComponent 8 /Length 178256 /ColorSpace /DeviceRGB /Filter /DCTDecode >> 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 xZ[o~ Pjo\.*@-\yЅɤ,R$%KKIlٹ̷CbOG?z !(C ^D(2 &޻cI rIht|tǯ/??^z~ u<Kk Nյ>+;\L$H'ս!g0׵ʯCG.0[gU񿺴c1(^5ܞ$aaE;ҚPT Y:/ vӍK&qIgNza-3'*B}lnt5emLǾtӍF鸵9X\s*{׿p e_M`J_+_&c>g/m$1ּ1 9% L8tʈD&;=LE meڗCOl{$X&rSF4۔RIf]cy>L,7ЖMrjPH1S^ `sf:5SN!7+>+z8FFFSFΫ#0D_Ǹ@Qs=Njl Ndﱺ{ `\e܆0 [窚=2c.WU/I><&=FS e#,DRTbʁE?-z2ީ Җ}*|bQ=( #@8~ B`E=Gj<]t'i9 GOhI6ZoV!dZfs v-P0NM߾-TJdj198l{xXi|ױb*Q+M? y.ӶsWڿ3fqt*И0ӲQmUhXĺ}z#j"B,b."b~7` rFzLVf> 6qHH J6b:\IaP%o7T)NgcFճ5e&7tj oQ^CԖuAU,=빩D5@PO52[`@>b5*Ij4Y]w]Q")v}3K$҅zޜ4WmVɐNek7]p34T<+ߋ쯴Q"2 ^!8n-[fg4[e֐t}Lo6M U`UF\TǼ;x8w `%%vm78A : ʘUb+ig=P 4)q;[^0#8 s< endstream endobj 1547 0 obj << /Type /ObjStm /N 100 /First 981 /Length 2339 /Filter /FlateDecode >> stream xZmo_o (Cq"I A'omɐidGj-z0lp ;#+aAEa'FOXn8q y QPÓ6t&T(eR@kUn3 :<ъ -[Q3VO3'Ǫ6"-YhiAƲ`I 0ui02܂#ER-<8bc/i Cֈ`4f㙟 \Ea@4`:<BdH-+br J"xA+#39 x "z# rz7ܾNO!杅f,d_pDܲdt# [ɚ9~T']݊O:9:[+Nxū{UzP=Jq;(yz[&Q=M} NOZ4MeLo8Лx!Z= w׿{P=LiCV/W3t )5‚\H2`VEl$8A{ NT/&':FM[z:~ȺYHq$>尝cAzx|}yyI6L7N$DJ :oНߺ -KHc I*KHp/Yq] [i4Y0c;to3 P) B#u=-&$4(qɎb_i8)khYښԺu[/ErRB5R$h$Eߝ@ȽpX^Ȅ OX"](2#>SĦb^OPx{=ZqKDw%PXT( ?X7r$ɚn/k^{c!»z5.JelB^1{eyY^}~C}?r}:> >$8]nw.&/LMS4A@,Zm C>;Xغr;+-`_ a-Za:4右;{ ;\Xہ6O;ہ""YҠ ,^F iNp& u1)c5NMuhAn򹔒lu=aQr=-IƳPCQ8~J.voǽ7cRPgo)6_7N{cm7_E[Oֻ9eBH&,hvlR8lI+VOBMGrV̝rCYR[6 W2A|"A=­|Q nd})xwnJZ /_KoюCvbɾD0"n@; endstream endobj 1679 0 obj << /Length 1702 /Filter /FlateDecode >> stream xnF |kr4 W<$H֡" aYd$R;!5H'`ny2#hc@ @8?682.lr2BAaP@ۛݥE{A͛ۿջ͟n3(.nad;Ė\Iʈdx!#(؂͒.6YI#tgBxѷH)qV: b d&kl~ 9Mסˉ0)`pIEGu/<}Wgd.tiZ%x判;A>^@ b, A-H~}ǟBИtyy* t}xjp\ wu:ٰm sb,nCIs ؖ%Ta T-rNꚣ^E H(PK:ܤw#*?/"q֩ qt׳ڽ&>hJynw():)ҰwEZi505T[@H [T\"SH|QTA5S6ʼ ?ٵP_Z.ws|,%3LJ\x03LTKPപ[-Am?bW,pmlk]U1 P< ц`qTW' +3aG.pԣBnCwYXdz\3<1(7Js`##3\s#Vps_!LU5=;^e+PHh3šA< ]8f6ǚWFR`5i HSeSuIQ#Jl#U DEYmG26}+VI2C9{~υb8/*)lY"@ss=q̯$y"oL]AЂLEJ4JmxDžVyȲKiew"_;I5FN6ֻۇd& P77t^pLY{{ :4;4!@ r>QpdC<^ZyRn"na3gTP ÉLL"2oh t2! [u\5c;2ޞm{am@yYn;]S| C1=-O\4f=V|w,F~BSgOUYQz,$1*9KD&S o_D)2i,?P[ &ZH7\BRsMњ4uBS/[yU>˯-$kϟFUr& ʵ-c7D֨тi/i]pX`'Y2-ɢF&§TE3-s1f)ަ>>(lKwQq5Rv 19}:_3݃{1a-Hvr=' iCNTLqӠT>@R$\xN'req`iVE\8^')z `=]\og= endstream endobj 1687 0 obj << /Length 2533 /Filter /FlateDecode >> stream xZ[o~` j<7rxY M&^d$((XS"Klw3RBG.> ;[?zz~t`lץ(zo3D(ͅG'fsF}ӓr&x?g?W?|z?]aB@ŀr62< PQOns̚S1n2 FJ$[J:Fm U&_60*)^b.=ӡ۰%߿ؿV`Tҹ&{U':1:9a uN܃q˴TOڨɊwawFfZ~ ("P)-0ۅχ: ַH(oӐ8,æjScGYV1*ޏ2f8ܷ E\#uxM%NK?m>:ugMH Y(FmIGbUUT!v)LM;:ͧ6RRN $uVlhjT6a,WoQ:.GZ$И,(fV&{Q-6,i*XdAVhi|2<< w'#.j[H7Y9SRtwAkǽ[+k%2=C=D=C~#:cu.TE ݬrZj3CYSVԱ\ 4 :b+'>KU zVi赸X˓\VZO<c$u"3 .6iz&<4sg>!emRR) $LihiC$E6?zU?`v $G2Kι]D1sG &S)8!_ȷ>n)ZcO`@YJG2<*0u0 i-0swHGY͑ *33]gM&yeT5zKOCQmY*7D\ v-ԻEIJb80;6z%:Jj[@ۥF m,q jV`'Sfs5%Mlr{QrFdh)F!">tZ첡>Fn gO| +56hpq#kU/ M ^+#":ۨK)[5̌=o)0"o& ͐/E蓹#x܊G?b+E`[Wj9*M_sx)Z W:m?@>!NZ.أ2c{ߴif%'\n^h D'BRđeI Q"ޯTjyOoW֐WyHr5[2ͬHrTVVȃz)F;>= i0 4Q5gp5d 0LƍC]`8b٢ڵ*284XU]<:]siJmlO ɏzt:Eb",\D<}h뮜N%kKO½J`wDvl ^#(bshi[I;% Z@%ySWwo պW-*0TmrAqFymFQezڢ+r/ڮ@Lacґ|1Zue֭E #7`;5&D컣;K2 ~wíCE0T SJ[:ʪt|43} @|fG1b*TS@e٨p &sKŘcO̥ G||˷=<H"^ȫ.&5:ޫ Vz:̷*!;!]?2.u_|]fnϒry/v~yv5$( !~"c2nrU=Gv06X} Ctfp|*KZ Tz> stream xZsOT%xWKK2iruLDl(R>7=R @n3 .}`tVtޝ_! BJ3[: ;,-1ZPAha37g#%`\oߩѷ̽˛?{ jA biP>|} AI`,UWkB?g3Sҏ[0(7A34W2U@"a>y>9u2/HX"'ǁLO,(U?@ xHDBM*ɢHN4>nbUR U2pC\1E.^{Gk܌r. h^ B ΙZtA&)N,N}:򱡚I7Pb R t8\A29`b^9w Bcd啌. -ntJ.~RC1z e4& ,ǩ2a26waѦ1LzS`e Bۦ Mk;G)2)b#.4㕧#`d1'[-y8 D?G~ j khL6sUFT#'.yjLgk a%]*~f֎Oe $ⶫo5XQAۃ:v'߳R=c=yU5!u^ y}ˤrzGҚMlQRPD 4LV] p h@yG]]OӔx'- DGj5pQ`0V~o 8!K 0p hA~Y'7Ƃ`h]tPplN@kfчum{t)=;<%Bc{<0JOƲ 5OԷRRͺVA [/e?elϊ>1l?ӆ\&i:->8$ɰ#tO 8.5ǡ6P9Vo k{Skcd7TEb7%Uɣ _h;_mc34Oj)灍fMO0,l5*_E.y8+<Mg|VO/%w/ܛJ,+NelbD}r |G"#A.Ywq3ynW䩾ٸ#(j@>޶GOۑدw Cm~/|b%45X! JٷWZ`q}șbV-mrƦiuP;כ4ey 1, 5KEBZ ܋\]뮓ˣ4 ]M:#(7WE_KEaJ #'Խq慺ymEncuvd+5d;VIG8-Z4I1"30SQ;2@qub~Ф E -`FAZ#p 5 ;$x`H(l:`DH`[@ mˮS$eQ)w) Zc ^! G M3ET"Ֆk4;`'&3$aJ,ϠKG$S j(aՁK)?Qc: Ψ8݈J Aā@]J Mâ-opS.bNńMuGa ?;rUgaNe@m[;W endstream endobj 1681 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/rmuonde.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1696 0 R /BBox [0 0 420 420] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1697 0 R >>>> /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 1683 0 obj << /Type /XObject /Subtype /Form /FormType 1 /PTEX.FileName (./cpfigs/tempmuonde.pdf) /PTEX.PageNumber 1 /PTEX.InfoDict 1700 0 R /BBox [0 0 420 420] /Resources << /ProcSet [ /PDF ] /ExtGState << /R7 1701 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 1704 0 obj << /Length 2493 /Filter /FlateDecode >> stream xZKsFW|Wx$$vISYUʲ PQBT<А-*QlLO?]pݫWo{s;Iړa(w1D Nsc{/}xcu1>h)E=7(1ߞu7IIc}!8yy9Ԏ#Tʴ(1",N(cW:sP6hvB WusA_c@Z|@,p%*0 N9~̬VSI#ub3xe3 ;4a Bqw>s#ܞ)℗ 6C} MP4p(r84Ȩ.bq!5Rec/ϦOb,<Ms3R`5Q~J Ej[%MRL2E P;Mz$qMZ%<-Ц,s \- +bJ(ܥĒ5M'8|3 td;u^U!%h*,+tMS7_e}TzV͂D,h3OB;:XLNNbA/In &\A Zkt ;#NP$ڬ]% @HrybV_fiZջtveA{5ne6ͯzwMA9Ԗ6o|hd/)$*-қq6+%mEM1yAuDH%%KKmhjECK}f46_̂^mjF`w{s;4\o ̯qk+!1ޑ.tVH(h# hK@ȯ&@0YW@lF0AHϝO8 yvW曗Lyńv1) fYsw.6/I7//#ʵ)4+"ø1foLfˮhTc?DUM2 ~$fM#i r2-GJ0{j!A0kIZ!cM+ZqԢkR'q[uPVJQh@h4WYd?^tGdA2ږL7tV\W|ֹUQ W&w죝pj-M#BeZv١`6/)6/ۖPeord99%adE# v˶Nڢ1[whMʲ^8 b9("A- KWow K8Zf*/^@! "~-n!=1^ %xؙ?[܁.wRʋnX{u:jI;Eǣq2&SyMk_2:jkdOT`+3{#Ӌ2۰+m_T(nL*JIv\ q]/+ϐ/Z//ukF9MorlѽRaƑx9di36|QcݼVCݽ]k<[XbMŝ^`;D#~mFb\Qp$92%Uw5VhmתXec[ ˦M1k8z%HE8̞hKߏC]4 koc湺֏|Zo^P촶|NRm1y<ܟ__w6bvW-gć+ endstream endobj 1711 0 obj << /Length 2699 /Filter /FlateDecode >> stream xYYsܸ~ׯkA҃Inl=$4gH-ɱW忧q(6nRҀ`hu.gxvlAtvv1StQ&gg٧Hg >e;}92bh$?{ջS7WE7̲{3 %J(Li O8|DR;(Qj֛.+O蕶 X#a>ηfb)@|ܚڗsDJQK<+Xད /֋H@&&M/mŜ5e&R>a:C yHqwo;cȟӎqej1IJm6|q.FPwwVnp?*-\W?Pck?]}>jBH@ON?#>xまsyg.u#?<7Q?Z##'nG'B; K2@M2;DŽ-m}x^'[ Nx} {,<<"GAOe^XUVts~zD+?t]u%T=ߟ =*z?yx?qEY)-΋>k]mLLO0y担h3Z%1C@XeIMCks#:+^C-ag8 ` GikBM[G# Cabe&̣31Y b"¿f//(Ѩ:3!y{ N (%]9Cų>mD#Ls"njTͿ>oyfrub͛`T qPBh]Gw2zFg{W3Qڍ녮*cp^דͩ= =1 [-B䈪[H0ZY"VT+#Q.,"] m0.EP P5J JF̱b';3v\1g,90 ALXIt]nSD ASHEj*ı~ ޥڭ(|5ty8#kfPmƧ3G Dmb/|21Un#EסS($T?$q&LHҮESLȫC7 .*FC6򪰰wsby`zJ;At8l'xBjuX;yE{s{|G<%z34 ,Eoh_5^mX<{Y 5@bhjdI( p&mT*R*Ois\̅Z_X )7eބSb>qrKo2\ل5}pl<"d;ourn9= g٦:nذ?F3~GU~"lΕwtߦ<[07]~Q5" X1' JcMu1GA0$!񘪧CMe,gr~Ŵ#[PAk@vT}n86L]*aU D$`p%{TI܂#Iw \Ɨw' #ɝOl0<(xMɀ(Nau&Q rN /_߶u9(i21iPD,H02(wnp!oNhb `:8ȈBZ ҉@J!'xw(]==ɝMn)C5&;B`#[’t;Қ.ZkOi폒1:bYD%;vcd(2[Du' {R$u>/Font << /R8 1718 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Ѫ

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 -------- 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)); assert(A && A->A); 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; } AnyType SetMatrixInterpolation(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(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 SetMatrixInterpolation(Stack stack,Expression emat,Expression einter) { 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; 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; sparse_mat->typemat=TypeSolveMat(TypeSolveMat::NONESQUARE); // none square matrice (morse) sparse_mat->A.master(buildInterpolationMatrix1(*Uh,xx,yy,data)); } return sparse_mat; } AnyType SetMatrixInterpolation3(Stack stack,Expression emat,Expression einter) { 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 " <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); // 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 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); 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); 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; 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;; if(!init) sparse_mat->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; 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)); // 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: typedef Matrice_Creuse * Result; Expression emat; Expression coef,col,lig; RawMatrix(const basicAC_F0 & args) ; 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; Expression emat; Expression ** e_Mij; int ** t_Mij; BlockMatrix(const basicAC_F0 & args) ; ~BlockMatrix() ; static ArrayOfaType typeargs() { return ArrayOfaType(atype*>(),atype());} static E_F0 * f(const basicAC_F0 & args){ if(IsRawMat(args)) return new RawMatrix(args); else return new BlockMatrix(args); } AnyType operator()(Stack s) const ; }; 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) { 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) { 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; if(cas==0) mrr = new MatriceMorse(*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)); // 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)); //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; } 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)); 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), new OneOperator2_*,Matrice_Creuse*,const MatrixInterpolation::Op*,E_F_StackF0F0>(SetMatrixInterpolation3) ); TheOperators->Add("<-", new OneOperator2_*,Matrice_Creuse*,const MatrixInterpolation::Op*,E_F_StackF0F0>(SetMatrixInterpolation), new OneOperator2_*,Matrice_Creuse*,const MatrixInterpolation::Op*,E_F_StackF0F0>(SetMatrixInterpolation3) ); // 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(); } int Data_Sparse_Solver_version() { return VDATASPARSESOLVER;} freefem++-3.26-2/src/fflib/lgmesh.cpp000644 000767 000767 00000143343 12240775536 016453 0ustar00hecht000000 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" 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 =2; 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;} 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)} }; // 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 =27; 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;} 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 }; 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 =2; 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;} 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)} }; //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); ffassert( nbvx >= 0); return SetAny(Add2StackOfPtr2FreeRC(stack,BuildMesh(stack,borders,false,nbvx,requireborder))); } 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 split(Th.nt); split=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 ; } *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.26-2/src/fflib/lgmesh3.hpp000644 000767 000767 00000002505 11406226635 016527 0ustar00hecht000000 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.26-2/src/fflib/lgsolver.hpp000644 000767 000767 00000045220 12232505407 017016 0ustar00hecht000000 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); 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); } 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.26-2/src/fflib/load.cpp000644 000767 000767 00000007707 12167254041 016105 0ustar00hecht000000 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.26-2/src/fflib/Makefile.am000644 000767 000767 00000004660 12211632057 016506 0ustar00hecht000000 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/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 \ 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 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 # -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.26-2/src/fflib/Makefile.in000644 000767 000767 00000266661 12245613204 016532 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) \ 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) 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 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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/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 \ 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 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 # -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 .PRECIOUS: 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)/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@ .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 $< .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 `$(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` 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 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.26-2/src/fflib/mt19937ar.cpp000755 000767 000767 00000014320 11406226635 016541 0ustar00hecht000000 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.26-2/src/fflib/._Operator.hpp000644 000767 000024 00000000253 11777227274 020214 0ustar00hechtstaff000000 000000 Mac OS X  2yATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/src/fflib/Operator.hpp000644 000767 000767 00000047472 11777227274 017007 0ustar00hecht000000 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_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 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_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.26-2/src/fflib/PlotStream.hpp000644 000767 000767 00000022417 12232507347 017263 0ustar00hecht000000 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(bool)}, { "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); // int IsoLineK(double *f,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 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; } 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) { 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) { 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 < 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 && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); if ( ccc != cc) { cerr << cc << " != " << ccc << " => "; cerr << "Sorry error in Optimization (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 > 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 ) { 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 bool 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); 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) ) 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 & optiexp0=*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(&optiexp0) optiexp0(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) ExecError("To Day in bilinear form with discontinous Galerkin: \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 "); matep= new MatriceElementairePleine(Uh,VF,FIT,FIE); matep->faceelement = Element_OpVF; paramate= ¶mmatElement_OpVF; } else if (sym) { mates= new MatriceElementaireSymetrique(Uh,FIT,FIE); mates->element = Element_Op; } else { matep= new MatriceElementairePleine(Uh,Vh,FIT,FIE); 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(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) { 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"); } 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 ) { 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 ) { 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 bool 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 & FIE = di.FIE(stack); const QuadratureFormular & FIT = di.FIT(stack); const 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::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()) InternalError("Sorry no levelset integration type on this case (7) "); if(di.islevelset() && (CDomainOfIntegration::int2d!=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 & optiexp0=*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(&optiexp0) optiexp0(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) ExecError("To Day in bilinear form with discontinous Galerkin: \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 "); matep= new MatriceElementairePleine(Uh,VF,FIV,FIT); matep->faceelement = Element_OpVF; paramate= ¶mmatElement_OpVF; } else if (sym) { mates= new MatriceElementaireSymetrique(Uh,FIV,FIT); mates->element = Element_Op; } else { matep= new MatriceElementairePleine(Uh,Vh,FIV,FIT); 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 ) { 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 ) { 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) { 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 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 ) { 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 bool 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 & FIE = di.FIE(stack); const QuadratureFormular & FIT = di.FIT(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::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) ) 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 & optiexp0=*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(&optiexp0) optiexp0(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 ) { 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) { 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; 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 ) { 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 bool 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 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) ) 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 & optiexp0=*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(&optiexp0) optiexp0(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 ) { // 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) { 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 << 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 && 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 (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; i 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 && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); if ( ccc != cc) { cerr << cc << " != " << ccc << " => "; cerr << "Sorry error in Optimization (b) 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) { 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 << 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) for (npi=0;npiset(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 && 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 (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); 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 jj(ll.first.first),ii(ll.first.second); R w_i = wi(ii.first,ii.second); R w_j = wj(jj.first,jj.second); R ccc = copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); if ( copt && 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 (a) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } *pa += coef * ccc * w_i*w_j; } } } */ } else // int on edge ie for (npi=0;npiset(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 && 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 (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; 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 && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); if ( ccc != cc) { cerr << cc << " != " << ccc << " => "; cerr << "Sorry error in Optimization (b) 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) { 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 << 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 (c) 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 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 (c) 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; 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;npiset(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 (c) 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 (c) add: int2d(Th,optimize=0)(...)" << endl; ExecError("In Optimized version "); } } *pa += coef * c * w_i*w_j; } } }*/ } else // int on edge ie for (npi=0;npiset(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 (c) 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 && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " != " << cc << " => "; cerr << "Sorry error in Optimization 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; } // 3D template void Element_rhs(const FElement3 & Kv,const LOperaD &Op,double * p,void * vstack,KN_ & B, const GQuadratureFormular & FI = QuadratureFormular_Tet_2) { 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 << 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 && Kv.number <1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " != " << cc << " => "; cerr << "Sorry error in Optimization 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) { 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) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " != " << cc << " => "; cerr << "Sorry error in Optimization 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) { 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 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) { // 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 << 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 && Kv.number<1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " =! " << cc << endl; cerr << "Sorry error in Optimization 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; } // find 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) { 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 << 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 && Kv.number<1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " =! " << cc << endl; cerr << "Sorry error in Optimization 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) { 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 << 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 && Kv.number<1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " =! " << cc << endl; cerr << "Sorry error in Optimization 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) // sier of ip { pair_stack_double * bs=static_cast(bstack); Stack stack= bs->first; double binside = *bs->second; // truc FH pour fluide de grad2 (decentrage bizard) 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 << 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,&KKv); 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); bool onborder= &Kv.T == &KKv.T; 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 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 = 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 } R c =copt ? *(copt[il]) : GetAny(ll.second.eval(stack)); // FFCS - removing what is probably a small glitch if ( copt && Kv.number<1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " =! " << cc << endl; cerr << "Sorry error in Optimization 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 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) { 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 << endl; assert(Op.MaxOp() 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 && Kv.number<1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " =! " << cc << endl; cerr << "Sorry error in Optimization 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) { // 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 << 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 && Kv.number<1) { R cc = GetAny(ll.second.eval(stack)); if ( c != cc) { cerr << c << " =! " << cc << endl; cerr << "Sorry error in Optimization 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 bool 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 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::int1d!=kind) ) InternalError("So no levelset intgeration type on no int1d 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 & optiexp0=*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(&optiexp0) optiexp0(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] <(Vh[i],ie,Th.be(e).lab,*l->l,buf,stack,*B,FIT,false); else Element_rhs(ThI,ThI[i],Vh,ie,Th.be(e).lab,*l->l,buf,stack,*B,FIT,false); 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) { 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); else Element_rhs(ThI,ThI[i],Vh,*l->l,buf,stack,*B,FIV); 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); else Element_rhs(ThI,ThI[i],Vh,ie,lab,*l->l,buf,stack,*B,FIT,false); 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 bool 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 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) ) ) InternalError("So no levelset integration 1d on the 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 & optiexp0=*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(&optiexp0) optiexp0(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]); } else 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); else Element_rhs(ThI,ThI[i],Vh,ie,Th.bedges[e].lab,*l->l,buf,stack,*B,FIE,false,intmortar); 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); } 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 { 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); else Element_rhs(ThI,ThI[i],Vh,*l->l,buf,stack,*B,FIT); 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() ; 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; */ cerr << "Warning : Order of the Integration Formular order " << exact+1 << " exact = " << exact << endl; // ExecError(" We find no Integration Formular on Tet for this order to hight"); 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 << " Ordre of the Integration Formular ordre " << exact+1 << " exact = " << exact << endl; ExecError(" We find no Integration Formular on Triangle for this order to hight"); 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 Integration Formular on Edge for this order to hight"); 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.26-2/src/fflib/._problem.hpp000644 000767 000024 00000000247 12154342764 020054 0ustar00hechtstaff000000 000000 Mac OS X  2uATTR  com.apple.TextEncodingmacintosh;0freefem++-3.26-2/src/fflib/problem.hpp000644 000767 000767 00000137725 12154342764 016645 0ustar00hecht000000 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); } 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; 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 bool 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; void init() { A.init();Uh.init();Vh.init(); typemat=TypeSolveMat(TypeSolveMat::NONESQUARE);} Matrice_Creuse() { init();} void destroy() { A.destroy(); // 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);} }; 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); template void Element_rhs(const FElement3 & Kv,const LOperaD &Op,double * p,void * stack,KN_ & B); template void Element_Op(MatriceElementairePleine & mat,const FElement3 & Ku,const FElement3 & Kv,double * p,int ie,int label, void *stack); template void Element_Op(MatriceElementaireSymetrique & mat,const FElement3 & Ku,double * p,int ie,int label, void * stack); 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); template void Element_rhs(const FElement & Kv,const LOperaD &Op,double * p,void * stack,KN_ & B); template void Element_Op(MatriceElementairePleine & mat,const FElement & Ku,const FElement & Kv,double * p,int ie,int label, void *stack); template void Element_Op(MatriceElementaireSymetrique & mat,const FElement & Ku,double * p,int ie,int label, void * stack); /*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.26-2/src/fflib/Serialize.hpp000644 000767 000767 00000005435 11464553225 017123 0ustar00hecht000000 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.26-2/src/fflib/showverb.hpp000644 000767 000767 00000001753 11406226635 017030 0ustar00hecht000000 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.26-2/src/fflib/String.hpp000644 000767 000767 00000012422 11406226635 016432 0ustar00hecht000000 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.26-2/src/fflib/string_def.cpp000644 000767 000767 00000011610 12035273044 017274 0ustar00hecht000000 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.26-2/src/fflib/strversionnumber.cpp000644 000767 000767 00000001057 12245613326 020607 0ustar00hecht000000 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.26-2/src/fflib/strversionnumber.m4000644 000767 000767 00000001033 11406142256 020334 0ustar00hecht000000 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 : ffassert #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.26-2/src/fflib/UMFPack_Solver.cpp000644 000767 000767 00000026647 12167254041 017752 0ustar00hecht000000 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.26-2/src/fflib/versionnumber.hpp000644 000767 000767 00000000034 11406226635 020056 0ustar00hecht000000 000000 #include "config-wrapper.h" freefem++-3.26-2/src/femlib/assertion.hpp000755 000767 000767 00000000432 11406226635 017350 0ustar00hecht000000 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.26-2/src/femlib/BamgFreeFem.cpp000644 000767 000767 00000062461 11460307406 017437 0ustar00hecht000000 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 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 "RNM.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++; } Fem2D::Vertex * v = new Fem2D::Vertex[nv]; // set the vertices -- for (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(); } } // warning in cracked edges // construction of the edges -- if (nbcrakev && verbosity>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) { using namespace bamg; using bamg::Abs; using bamg::Max; using bamg::Min; using bamg::Pi; Fem2D::MeshPoint & mp (*Fem2D::MeshPointStack(stack)), mps = mp; int nbvx=0,nbe=0,nbsd=0; for (E_BorderN const * k=b;k;k=k->next) {long n= Max(1L,Abs(k->Nbseg(stack))); ; 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) { assert(k->b->xfrom); // a faire double & t = * k->var(stack); double a(k->from(stack)),b(k->to(stack)); n=Max(Abs(k->Nbseg(stack)),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)); } } } lmin = sqrt(lmin); double eps = (lmin)/16.; int nbvprev = i; long nbv=0; Gh->pmin = 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(); 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) { double & t = * k->var(stack); double a(k->from(stack)),b(k->to(stack)); n=Max(Abs(k->Nbseg(stack)),1L); 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==nbvprev); throwassert(i==Gh->nbe); // definition the default of the given mesh size if (!hvertices) { for (i=0;inbv;i++) 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,i++) { long Nbseg =k->Nbseg(stack); 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; Triangles *Th = 0; try { Th =new Triangles( nbtx ,*Gh); if(0) { Th->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) { assert(k->b->xfrom); // a faire double & t = * k->var(stack); double a(k->from(stack)),b(k->to(stack)); long n=Max(Abs(k->Nbseg(stack)),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) { nbd++; assert(k->b->xfrom); // a faire double & t = * k->var(stack); double a(k->from(stack)),b(k->to(stack)); long n=Max(Abs(k->Nbseg(stack)),1L); 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; for (E_BorderN const * k=this;k;k=k->next) nbd1++; plot << nbd1; int nbd=0; for (E_BorderN const * k=this;k;k=k->next) { nbd++; assert(k->b->xfrom); // a faire double & t = * k->var(stack); double a(k->from(stack)),b(k->to(stack)); long n=Max(Abs(k->Nbseg(stack)),1L); 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.26-2/src/femlib/BamgFreeFem.hpp000644 000767 000767 00000004261 11406226635 017442 0ustar00hecht000000 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); 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.26-2/src/femlib/CGNL.hpp000644 000767 000767 00000006305 11406226635 016066 0ustar00hecht000000 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) { // ------------- 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 >1 ) cout << "CGNL:" < #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 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::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) { 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*)); 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); 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(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) { if (!NbAllocShow) NbAllocShow=NbAlloc; printf ("----------CheckPtr:-----%s------ NbUndelPtr %ld Alloc: %ld NbPtr %ld \n",s,NbPtr,AllocSize,NbAlloc); 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; 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) { 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.26-2/src/femlib/ConjuguedGradrientNL.cpp000644 000767 000767 00000006650 11406226635 021356 0ustar00hecht000000 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.26-2/src/femlib/Drawing.cpp000644 000767 000767 00000046337 12017365531 016740 0ustar00hecht000000 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.26-2/src/femlib/Element_RT.cpp000644 000767 000767 00000055177 11406226635 017347 0ustar00hecht000000 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.26-2/src/femlib/._fem.cpp000644 000767 000024 00000000247 12232456302 017321 0ustar00hechtstaff000000 000000 Mac OS X  2uATTR  com.apple.TextEncodingmacintosh;0freefem++-3.26-2/src/femlib/fem.cpp000644 000767 000767 00000157601 12232456302 016105 0ustar00hecht000000 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[j]=0; l[3-nl[0]+nl[1]]=1; 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 // 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);} #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; // no copy 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'eleent 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.26-2/src/femlib/fem3.hpp000644 000767 000767 00000000011 11406226635 016161 0ustar00hecht000000 000000 to removefreefem++-3.26-2/src/femlib/FESpace-v0.cpp000644 000767 000767 00000142564 11406226635 017137 0ustar00hecht000000 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.26-2/src/femlib/._FESpacen.cpp000644 000767 000024 00000000252 11716230243 020172 0ustar00hechtstaff000000 000000 Mac OS X  2xATTRcom.apple.TextEncodingiso-8859-1;513freefem++-3.26-2/src/femlib/FESpacen.cpp000644 000767 000767 00000043151 11716230243 016754 0ustar00hecht000000 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; int *Ks; 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.26-2/src/femlib/FESpacen.hpp000644 000767 000767 00000063551 11406226635 016775 0ustar00hecht000000 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.26-2/src/femlib/FQuadTree.cpp000644 000767 000767 00000057376 12167254041 017171 0ustar00hecht000000 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.26-2/src/femlib/FQuadTree.hpp000644 000767 000767 00000011124 11406226635 017156 0ustar00hecht000000 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.26-2/src/femlib/._GenericMesh.hpp000644 000767 000024 00000000247 12151157475 020761 0ustar00hechtstaff000000 000000 Mac OS X  2uATTR  com.apple.TextEncodingmacintosh;0freefem++-3.26-2/src/femlib/GenericMesh.hpp000644 000767 000767 00000135530 12151157475 017542 0ustar00hecht000000 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" 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; } 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 = 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; assert(it<10); for (typename HashTable::iterator qe,pe=equi.begin() ; pe != equi.end(); ++pe) { assert( pe->k < pe->v); qe=equi.find(pe->v); if(qe) { change++; assert( qe->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.26-2/src/femlib/glutdraw.cpp000644 000767 000767 00000026762 11406226635 017200 0ustar00hecht000000 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.26-2/src/femlib/gmres.hpp000644 000767 000767 00000010375 11705630521 016455 0ustar00hecht000000 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 > int GMRES(const Operator &A, Vector &x, const Vector &b, const Preconditioner &M, Matrix &H, int &m, int &max_iter, Real &tol,long verbosity) { 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; if ((resid = abs(s(i+1)) / normb) < tol) { 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; } freefem++-3.26-2/src/femlib/._GQuadTree.cpp000644 000767 000024 00000000252 12122014237 020362 0ustar00hechtstaff000000 000000 Mac OS X  2xATTRcom.apple.TextEncodingiso-8859-1;513freefem++-3.26-2/src/femlib/GQuadTree.cpp000644 000767 000767 00000047150 12122014237 017147 0ustar00hecht000000 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>100) cout << " nn : "<< nn << endl; if (nn>0) { //j=nadj[nRand(nn)]; j=ni[nRand(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;i100) { 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.26-2/src/femlib/GQuadTree.hpp000644 000767 000767 00000017756 11406226635 017200 0ustar00hecht000000 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.26-2/src/femlib/HashTable.hpp000644 000767 000767 00000006226 11406226635 017200 0ustar00hecht000000 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.26-2/src/femlib/HeapSort.hpp000755 000767 000767 00000002374 11406226635 017075 0ustar00hecht000000 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.26-2/src/femlib/InvIntFunc.cpp000644 000767 000767 00000003501 11406226635 017354 0ustar00hecht000000 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.26-2/src/femlib/Label.hpp000644 000767 000767 00000001145 11406226635 016357 0ustar00hecht000000 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.26-2/src/femlib/libmesh5.c000644 000767 000767 00000100064 11406142256 016477 0ustar00hecht000000 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/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 .PRECIOUS: 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 # 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.26-2/src/femlib/._MatriceCreuse.hpp000644 000767 000024 00000000253 12235133570 021311 0ustar00hechtstaff000000 000000 Mac OS X  2yATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/src/femlib/MatriceCreuse.hpp000644 000767 000767 00000076163 12235133570 020103 0ustar00hecht000000 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 lnk; // 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 MatriceElementaire(int datasize,int llga ,int *nnj,int * nni,TypeOfMatriceElementaire t=Full) : lga(llga),a(new R[lga]), ni(nni),nj(nnj),n(0),m(0),mtype(t),data(datasize), onFace(false),lnk(0),nik(0),nikk(0),njk(0),njkk(0) {} // for discontinous Galerkine method MatriceElementaire(int datasize,int llga,int *nni, int lk, TypeOfMatriceElementaire t=Symmetric ) : lga(llga),a(new R[lga]), ni(nni),nj(nni),n(0),m(0),mtype(t),data(datasize*(lk?2:1)) , onFace(lk!=0), lnk(lk), nik(lk? new int[lk*2]:0), nikk(nik+lk), njk(nik), njkk(nik+lk) { ffassert(lk>=0);} 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) =0; // const LinearComb,C_F0> * bilinearform; MatriceElementaire & operator()(int k,int ie,int label,void * s=0) { call(k,ie,label,s); 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) : MatDataFES(UUh,VVh,fit,fie), MatriceElementaire(UUh.esize()+VVh.esize(),llga,nnj,nni,t) {} MatriceElementaireFES(const FESpace & UUh,int llga,int *nni, TypeOfMatriceElementaire t=Symmetric, const QFElement & fit=*QFElement::Default, const QFBorderElement & fie =*QFBorderElement::Default) : MatDataFES(UUh,UUh,fit,fie), MatriceElementaire(UUh.esize(),llga,nni,nni,t) {} // 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) : MatDataFES(UUh,UUh,fit,fie), MatriceElementaire(UUh.esize(),llga,nni,lk,t) {} ~MatriceElementaireFES() {} const LinearComb,C_F0> * bilinearform; MatriceElementaireFES & operator()(int k,int ie,int label,void * s=0) { this->call(k,ie,label,s); 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; 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 *) ; void (* faceelement)(MatriceElementairePleine &,const FElement &,const FElement &,const FElement &,const FElement &, double*,int ie,int iee, int label,void *) ; void call(int k,int ie,int label,void *); MatriceElementairePleine & operator()(int k,int ie,int label,void * stack=0) {call(k,ie,label,stack);return *this;} MatriceElementairePleine(const FESpace & VVh, const QFElement & fit=*QFElement::Default, const QFBorderElement & fie =*QFBorderElement::Default) :MatriceElementaireFES(VVh, Square(VVh.MaximalNbOfDF()), new int[VVh.MaximalNbOfDF()],this->Full,fit,fie), 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) :MatriceElementaireFES(VVh, Square(VVh.MaximalNbOfDF()*2), new int[VVh.MaximalNbOfDF()*2], VF?VVh.MaximalNbOfDF()*2:0, this->Full,fit,fie), element(0),faceelement(0) {} MatriceElementairePleine(const FESpace & UUh,const FESpace & VVh, const QFElement & fit=*QFElement::Default, const QFBorderElement & fie =*QFBorderElement::Default) :MatriceElementaireFES(UUh,VVh, UUh.MaximalNbOfDF()*VVh.MaximalNbOfDF(), new int[UUh.MaximalNbOfDF()], new int[VVh.MaximalNbOfDF()],this->Full,fit,fie), 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; 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 *) ; void (* mortar)(MatriceElementaireSymetrique &,const FMortar &,void *) ; void call(int k,int ie,int label,void * stack); MatriceElementaireSymetrique(const FESpace & VVh, const QFElement & fit=*QFElement::Default, const QFBorderElement & fie =*QFBorderElement::Default) :MatriceElementaireFES( VVh, int(VVh.MaximalNbOfDF()*(VVh.MaximalNbOfDF()+1)/2), new int[VVh.MaximalNbOfDF()],this->Symmetric, fit,fie), element(0),mortar(0) {} MatriceElementaireSymetrique & operator()(int k,int ie,int label,void * stack=0) {this->call(k,ie,label,stack);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 int ConjuguedGradient(const M & A,const P & C,const KN_ &b,KN_ &x,const int nbitermax, double &eps,long kprint=1000000000) { // 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) 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))); if ( !(iter%kprint) && iter && (verbosity>3) ) cout << "CG:" <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 =(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); 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 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) // remark, if pKKE = 0 => 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 p[++k] =p[ii]; pk[k]=pk[ii]; pkk[k]=pkk[ii]; } ndf=k+1; return ndf; } // BuildMEK_KK template void MatriceElementairePleine::call(int k,int ie,int label,void * stack) { 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->lnk,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); } else { FElement KKv(this->Vh[kk]); this->n=this->m=BuildMEK_KK(this->lnk,this->ni,this->nik,this->nikk,&Kv,&KKv); faceelement(*this,Kv,KKv,Kv,KKv,this->data,ie,iie,label,stack); } } else { ERREUR("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); } else { int n2 =this->m*this->n; for (int i=0;ia[i]=0; element(*this,Kv,Kv,this->data,ie,label,stack); // call the elementary mat } } } template void MatriceElementaireSymetrique::call(int k,int ie,int label,void * stack) { // 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); }// 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 << endl; a = new R[nbcoef]; cl = new int [nbcoef];} ffassert( a && cl); for (int i=0;i 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) { 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.26-2/src/femlib/Mesh1dn.cpp000644 000767 000767 00000007406 11406226635 016640 0ustar00hecht000000 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.26-2/src/femlib/Mesh1dn.hpp000644 000767 000767 00000006127 11406226635 016644 0ustar00hecht000000 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.26-2/src/femlib/Mesh2dn.cpp000644 000767 000767 00000026221 11406226635 016635 0ustar00hecht000000 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.26-2/src/femlib/Mesh2dn.hpp000644 000767 000767 00000007570 11651763423 016653 0ustar00hecht000000 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.26-2/src/femlib/Mesh3dn.cpp000644 000767 000767 00000113305 11705630521 016631 0ustar00hecht000000 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; 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); 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(); } */ } 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) { 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(); } } 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) { bool ddd=verbosity>200; bool nomove=true; R lambda[4]; Phat.toBary(lambda); if(ddd) cout << "\n\n\n WT: " << 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; // 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(ddd) cout << "\t\t\tWT " << it << ", " << Phat << ", PF=" << PF << " : " << l[0] << " " <-eps && l[1]>-eps && l[2]>-eps && l[3]>-eps) { dt =0; Phat=R3(l+1); nomove=false; return -1; } else { // 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 << " k= " << k << endl; if (k==3) // 3 face de sortie possible { // let j be the vertex beetween the 3 faces int j = 6-neg[0]-neg[1]-neg[2]; // sommet intersection des 3 faces. int i0 = Tet::nvface[j][0]; int i1 = Tet::nvface[j][1]; int i2 = Tet::nvface[j][2]; if(ddd) cout << " -------- " << j << " " << i0 << " " << i1 << " " << i2 << endl; // le tet i0,i1,i2,j est positif. assert(signe_permutation(i0,i1,i2,j)==1); // R v0= det(Q[i0],Q[j],P,PF); R v1= det(Q[i1],Q[j],P,PF); R v2= det(Q[i2],Q[j],P,PF); if(ddd) cout << "\t\t\t " << j << " v0123 =" << v0 << " "<< v1 << " " << v2 << endl; if( v0 > eps && v1 < -eps ) kk= i1 ;// on sort par la face j i0, j1 else if( v1 > eps && v2 < -eps ) kk= i0 ; else if( v2 > eps && v0 < -eps ) kk= i1 ; else { // on ne sort pas par une face int nul[3], nn=0, mm=3; if (Abs(v0) <=eps) nul[nn++]=i0; else nul[--mm]=i0; if (Abs(v1) <=eps) nul[nn++]=i1; else nul[--mm]=i1; if (Abs(v2) <=eps) nul[nn++]=i2; else nul[--mm]=i2; assert(nn>0); if(nn == 1) // on sort par l'arete nul[0] entre le face nul[1] et nul[2] kk = nul[1+(rand()/(RAND_MAX/2))%2]; else // on sort par le sommet j. on choisi la face alleatoirement kk = nul[(rand()/(RAND_MAX/3))%3]; } } else if (k==2) { // numero des l'arete entre les 2 faces int i0=neg[0],i1=neg[1]; int e = i0 + i1 - (i0==0); // on a: // e = 0 1 2 3 4 5 // (i0,i1) = (0,1) , (0,2), (0,3) , (1,2) , (1,3), (2,3) // avec i0,i1 sont les sommets qui ne sont pas dans l'arete int jj0[6] = {2,3,1,0,2,0}; int jj1[6] = {3,1,2,3,0,1}; int j0 = jj0[e]; int j1 = jj1[e]; if(ddd) cout << " e " << e << " i0 " << i0 << " " << i1 << " j0 =" << j0 << " " << j1 << endl; // le tet j0,j1,i0,i1 doit est positif (ie. la pemutation est positive) // de meme i0,i1,j0,j1 assert(signe_permutation(j0,j1,i0,i1)==1); R v0= det(Q[j0],Q[j1],P,PF); if(ddd) cout << " v0 =" << v0 <0 ? i0 : i1; // Attention dyslexie ici durdur FH.... } else if (k==1) // une face possible de sortie (cas simple) kk = neg[0]; if(kk>=0) { R d=lambda[kk]-l[kk]; if ( l[kk] ) { throwassert(d); R coef = lambda[kk]/d; R coef1 = 1-coef; nomove= (coef<1.e-6); 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[3] = lambda[3]*coef1 + coef *l[3]; if(ddd) cout << " \t\t -> kk=" << kk << " d=" << d << " , l= "<< lambda[0] << " " < recherche un point final 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; } bool outside; const Mesh3::Element *K=Th.Find(PF, Phat,outside,&Th[it]); if(outside) dt=0; // on a fini if(ddd) cout << " \t ***** WT : Lock -> 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.26-2/src/femlib/Mesh3dn.hpp000644 000767 000767 00000012541 11705630521 016636 0ustar00hecht000000 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.26-2/src/femlib/._MeshPoint.hpp000644 000767 000024 00000000253 12045040732 020460 0ustar00hechtstaff000000 000000 Mac OS X  2yATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/src/femlib/MeshPoint.hpp000644 000767 000767 00000025136 12045040732 017244 0ustar00hecht000000 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]; 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.26-2/src/femlib/mortar.cpp000644 000767 000767 00000020230 11406226635 016633 0ustar00hecht000000 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 > 1024) { 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.26-2/src/femlib/P012_1d.cpp000644 000767 000767 00000012324 11406226635 016342 0ustar00hecht000000 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.26-2/src/femlib/._P012_2d.cpp000644 000767 000024 00000000252 12061325411 017551 0ustar00hechtstaff000000 000000 Mac OS X  2xATTRcom.apple.TextEncodingiso-8859-1;513freefem++-3.26-2/src/femlib/P012_2d.cpp000644 000767 000767 00000013634 12061325411 016336 0ustar00hecht000000 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.26-2/src/femlib/P012_3d.cpp000644 000767 000767 00000051473 11705630521 016347 0ustar00hecht000000 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.26-2/src/femlib/._PkLagrange.hpp000644 000767 000024 00000000252 11602363250 020565 0ustar00hechtstaff000000 000000 Mac OS X  2xATTRcom.apple.TextEncodingiso-8859-1;513freefem++-3.26-2/src/femlib/PkLagrange.hpp000644 000767 000767 00000006662 11602363250 017355 0ustar00hecht000000 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=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 class GQuadratureFormular { public: typedef Rdd Rd; typedef GQuadraturePoint QuadraturePoint; typedef GQuadraturePoint QP; const int exact; // exact const int n; // nombre de point d'integration 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),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),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),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),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),p(new QP[2]),clean(true) { p[0]=p0,p[1]=p1;Verification();} GQuadratureFormular(int ex,QP p0) : exact(ex),n(1),p(new QP[1]),clean(true) { p[0]=p0;Verification();} const QP & operator [](int i) const {return p[i];} const QP & operator ()(int i) const {return p[i];} ~GQuadratureFormular() {if(clean) delete [] p;} private: GQuadratureFormular(const GQuadratureFormular &) :exact(0),n(0),p(0){assert(0);} void operator=(const GQuadratureFormular &) {assert(0);} GQuadratureFormular() :exact(0),n(0),p(0){assert(0);} static const GQuadratureFormular * Default; }; template 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);} } namespace Fem2D { typedef GQuadratureFormular QuadratureFormular; typedef GQuadraturePoint QuadraturePoint; typedef GQuadratureFormular QuadratureFormular1d; typedef GQuadraturePoint QuadratureFormular1dPoint; GQuadraturePoint * GaussLegendre(int nn); } #endif freefem++-3.26-2/src/femlib/R1.hpp000644 000767 000767 00000007131 11406226635 015623 0ustar00hecht000000 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 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 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.26-2/src/femlib/R2.hpp000644 000767 000767 00000011063 11406226635 015623 0ustar00hecht000000 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 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 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.26-2/src/femlib/R3.hpp000644 000767 000767 00000011000 11406226635 015613 0ustar00hecht000000 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));} 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.26-2/src/femlib/RefCounter.hpp000644 000767 000767 00000006635 11406226635 017425 0ustar00hecht000000 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 { mutable int count; protected: virtual ~RefCounter() {} RefCounter() : count(0) {} public: int destroy() const { if(this) {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.26-2/src/femlib/._RNM.hpp000644 000767 000024 00000000252 12235133543 017211 0ustar00hechtstaff000000 000000 Mac OS X  2xATTRcom.apple.TextEncodingiso-8859-1;513freefem++-3.26-2/src/femlib/RNM.hpp000644 000767 000767 00000174315 12235133543 016002 0ustar00hecht000000 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 ... // ---------------- 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 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_; 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 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 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 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 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 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 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(this->next<0); if(this->next++ ==-1) {delete [] this->v; this->v=0;this->n=0;}} void increment() {assert(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 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,1/b);} template inline Mulc_KN_ operator*(const R &b,const KN_ &a) { return Mulc_KN_(a,b);} template inline Mulc_KN_ operator-(const KN_ &a) { return Mulc_KN_(a,-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 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 }; template class F_KN_ { public: A (*f)(B); KN_ a; long N() const {return a.N();} F_KN_( A (*ff)(B),const KN_ & aa): f(ff),a(aa) {} A operator[](long i) const { return f(a[i]);} bool check(long n) const { return n <= a.N() || a.constant(); } bool constant() const {return a.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.26-2/src/femlib/RNM_op.hpp000644 000767 000767 00000011574 12232503464 016475 0ustar00hecht000000 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 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.26-2/src/femlib/RNM_tpl.hpp000644 000767 000767 00000021213 12232503375 016646 0ustar00hecht000000 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;l5) { cout << " SplitSimplex " << endl; for (int i=0,l=0;i100) cout << "face i=0" << endl; for (int i=0;i100) cout << "l="<< l/3 << " "<< tri[l-3] <<" "<< tri[l-2] <<" "<< tri[l-1] <<" "<< endl; } // face j=0 if(verbosity>100) cout << "face j=0" << endl; for (int i=0;i100) cout << "l="<< l/3 << " "<< tri[l-3] <<" "<< tri[l-2] <<" "<< tri[l-1] <<" "<< endl; } // face k=0 if(verbosity>100) cout << "face k=0" << endl; for (int i=0;i100) cout << "l="<< l/3 << " "<< tri[l-3] <<" "<< tri[l-2] <<" "<< tri[l-1] <<" "<< endl; } // face i+j+k=1 if(verbosity>100) cout << "dernier face " << endl; for (int k=0;k100) cout << "l="<< l/3 << " "<< tri[l-3] <<" "<< tri[l-2] <<" "<< tri[l-1] <<" "<< endl; } if(verbosity>100) 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; 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]; K = new int[nk*(d+1)]; if( cas ==1) SplitSimplex( N, P,K); else { Rd G=Rd::diag(1./(d+1)); for(int i=0;i<=d;++i) { Rd Khat[d+1]; for (int j=1;j<=d;++j) Khat[j][j]=1; Khat[i]=G; SplitSimplex( N, P,K+nk1*i,nv1*i,Khat); } } } template void SplitSimplex(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.26-2/src/femlib/ufunction.hpp000644 000767 000767 00000005210 11406226635 017347 0ustar00hecht000000 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.26-2/src/Eigen/arpackff.hpp000644 000767 000767 00000040013 11406226635 016703 0ustar00hecht000000 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" 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 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; 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);} EigenValue(int c) : OneOperator(atype(), atype *>(), atype *>()), cas(c){} }; 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 = GetAny *>((*expOP1)(stack)); Matrice_Creuse *pB = GetAny *>((*expB)(stack)); double * residptr=resid? (double*) *resid : 0; //cout << " residptr = " << residptr <N(),nbev); const MatriceCreuse & OP1 = pOP1->A; const MatriceCreuse & B = pB->A; long n=OP1.n; 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)); } } } } 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; 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.m) 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(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(1)); // j + dJ Global.Add("EigenValue2","(",new EigenValueC(1)); // j + dJ } }; Init init; #endif freefem++-3.26-2/src/bin-win32/launchff++.cpp000755 000767 000767 00000001453 12033713743 017524 0ustar00hecht000000 000000 #include #include #include #include #include #include using namespace std; const char C='"'; int main(int argc,const char **argv) { char *dir=0; const char *pp=0; string cmd="freefem++.exe "; for(int i=1;i2) if( argv[i][1]==':') pp= argv[i]; cmd += C; cmd += " "; } if(pp) { 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; //cout << " chdir to " << dir << endl; _chdir(dir); delete [] dir; } cmd += " -wait -log"; //cout << "exec " << cmd << endl; int ret= system(cmd.c_str()); return ret; } freefem++-3.26-2/src/bin-win32/Makefile.am000755 000767 000767 00000010107 12167254041 017133 0ustar00hecht000000 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 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 = libff.dll FreeFem++-api.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 \ FreeFem++-api.dll $(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_FF) $(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 FreeFem++-api.dll:../nw/ffapi.o $(CXX) $(GCCNOCYGWIN) -shared -Wl,--enable-auto-import $< -o $@ # FFCS: automake does not clean the exes automatically because they are not built automatically. clean-local:: -rm *.exe freefem++-3.26-2/src/bin-win32/Makefile.in000644 000767 000767 00000045247 12245613204 017153 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 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 = libff.dll FreeFem++-api.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 .PRECIOUS: 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 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 \ FreeFem++-api.dll $(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_FF) $(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 FreeFem++-api.dll:../nw/ffapi.o $(CXX) $(GCCNOCYGWIN) -shared -Wl,--enable-auto-import $< -o $@ # 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.26-2/src/bamglib/Makefile.am000644 000767 000767 00000000652 11406142256 017020 0ustar00hecht000000 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 freefem++-3.26-2/src/bamglib/Makefile.in000644 000767 000767 00000035670 12245613204 017037 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 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 .PRECIOUS: 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 # 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.26-2/src/bamglib/._Mesh2.cpp000644 000767 000024 00000000247 12232456302 017667 0ustar00hechtstaff000000 000000 Mac OS X  2uATTR  com.apple.TextEncodingmacintosh;0freefem++-3.26-2/src/bamglib/Mesh2.cpp000644 000767 000767 00000443541 12232456302 016454 0ustar00hecht000000 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 register 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) { register 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; register 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 register Triangle *t1=this,*t2=at[a];// les 2 triangles adjacent register 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 register Vertex *sa=t1->ns[VerticesOfTriangularEdge[a1][0]]; register Vertex *sb=t1->ns[VerticesOfTriangularEdge[a1][1]]; register Vertex *s1=t1->ns[OppositeVertex[a1]]; register 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 register 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; register 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 register Int4 NbSwap =0; #endif register Vertex * s = this; Vertex &vP = *s,vPsave=vP; // if (vP.on) return 0;// Don't move boundary vertex register Triangle * tbegin= t , *tria = t , *ttc; register 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 &s0 = (* t)[0], &s1=(* t)[1], &s2=(* t)[2]; Icoor2 det3local[3]; int infv = &s0 ? (( &s1 ? ( &s2 ? -1 : 2) : 1 )) : 0; // infv = ordre of the infini vertex (null) register int nbd0 =0; // number of zero det3 register 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]= &s0 ? -1 : bamg::det(s ,s1,s2) ; det3[1]= &s1 ? -1 : bamg::det(s0,s ,s2) ; det3[2]= &s2 ? -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; 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 register int kk = t->NuEdgeTriangleAdj(j); assert ((*t)(VerticesOfTriangularEdge[j][0]) == (*ta)(VerticesOfTriangularEdge[kk][1])); assert ((*t)(VerticesOfTriangularEdge[j][1]) == (*ta)(VerticesOfTriangularEdge[kk][0])); register Int4 kolor =3*k + kk; ColorEdge[j]=kolor; register 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) { register 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 ; 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 register 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()); register 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 << "--------- " <The(); 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++; #ifdef DEBUG1 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=" << Norme(va->r-vb->r) << endl; cout << " s " << s << " lstep= " << lstep << " ledge= " << ledge << " lcurve= " << lcurve << endl; #endif 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.26-2/src/bamglib/._Mesh2.h000644 000767 000024 00000000253 12206613725 017336 0ustar00hechtstaff000000 000000 Mac OS X  2yATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/src/bamglib/Mesh2.h000644 000767 000767 00000135776 12206613725 016136 0ustar00hecht000000 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) { register Icoor2 bax = b.x - a.x ,bay = b.y - a.y; register 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: Triangles *Th; ErrorMesh(const char * Text,int l,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; 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){ register Triangle * t = at[a]; if(t) t->aa[aa[a] & 3] |=16; aa[a] |= 16;} void SetCracked(int a){ register 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){ register Triangle * t = at[a]; t->aa[aa[a] & 3] |=4; aa[a] |= 4;} void SetMarkUnSwap(int a){ register Triangle * t = at[a]; t->aa[aa[a] & 3] |=8; aa[a] |=8 ;} void SetUnMarkUnSwap(int a){ register 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 this? abscisse <0 :0;} int OnGeomEdge() const {return this? abscisse >=0 :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, ftqMesh=6,mshMesh=7}; 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; // end of variable Triangles(Int4 i);//:BTh(*this),Gh(*new Geometry()){PreInit(i);} ~Triangles(); Triangles(const char * ,Real8=-1) ; Triangles(Int4 nbvx,Triangles & BT,int keepBackVertices=1) :Gh(BT.Gh),BTh(BT) { try {GeomToTriangles1(nbvx,keepBackVertices);} catch(...) { this->~Triangles(); throw; } } Triangles(Int4 nbvx,Geometry & G) :Gh(G),BTh(*this){ try { GeomToTriangles0(nbvx);} catch(...) { this->~Triangles(); 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 ; 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() { register 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) { register Icoor2 bax = b.i.x - a.i.x ,bay = b.i.y - a.i.y; register 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.26-2/src/bamglib/._MeshDraw.cpp000644 000767 000024 00000000247 12232456302 020423 0ustar00hechtstaff000000 000000 Mac OS X  2uATTR  com.apple.TextEncodingmacintosh;0freefem++-3.26-2/src/bamglib/MeshDraw.cpp000644 000767 000767 00000055371 12232456302 017210 0ustar00hecht000000 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]]; register Vertex *sb=t1->ns[VerticesOfTriangularEdge[a1][1]]; register Vertex *s1=t1->ns[OppositeVertex[a1]]; register 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 register 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++; register Int4 i1= n /2; register Int4 j1 = n % 2; register 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.26-2/src/bamglib/Meshgibbs.cpp000644 000767 000767 00000062555 11406226635 017411 0ustar00hecht000000 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.26-2/src/bamglib/MeshQuad.cpp000644 000767 000767 00000064265 11406226635 017215 0ustar00hecht000000 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; register 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.26-2/src/bamglib/QuadTree.cpp000644 000767 000767 00000027630 11406226635 017213 0ustar00hecht000000 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]; register int l=0; // level register 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 { register int lll = pi[l]; register QuadTreeBox *b0=b; if ((b=b->b[lll])) { hb >>=1 ; // div by 2 register Icoor1 iii = ii[l]+I_IJ(lll,hb); register 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 { register Icoor1 iii = ii[l]+I_IJ(lll,hb/2); register 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]; register int l=0; // level register 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) register Icoor1 hb2 = hb >> 1 ; register int k = IJ(iplus,jplus,hb2);// QuadTreeBox number of size hb2 contening i;j register 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(register 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]--) { register 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 { register QuadTreeBox *b0=b; NbQuadTreeBoxSearch++; if ((b=b->b[k])) { hb >>=1 ; // div by 2 register Icoor1 iii = ii[l]+I_IJ(k,hb); register 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]; register int l=0; // level register 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]--) { register 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 { register QuadTreeBox *b0=b; NbQuadTreeBoxSearch++; if ((b=b->b[k])) { hb >>=1 ; // div by 2 register long iii = ii[l]+I_IJ(k,hb); register 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; register 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 (register int k=0;k<4;k++) // for the 4 vertices find the sub QuadTreeBox ij { register int ij; register 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) register Icoor1 hb2 = hb >> 1 ; register int k = IJ(iplus,jplus,hb2);// QuadTreeBox number of size hb2 contening i;j register 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(register 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 { register QuadTreeBox *b0=b; NbQuadTreeBoxSearch++; if ((b=b->b[k])) { hb >>=1 ; // div by 2 register Icoor1 iii = ii[l]+I_IJ(k,hb); register 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.26-2/src/bamglib/QuadTree.h000644 000767 000767 00000005276 11406142256 016656 0ustar00hecht000000 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.26-2/src/bamglib/R2.cpp000644 000767 000767 00000001674 11406226635 015764 0ustar00hecht000000 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.26-2/src/bamglib/R2.h000644 000767 000767 00000011214 11406142256 015414 0ustar00hecht000000 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.26-2/src/bamglib/SetOfE4.cpp000644 000767 000767 00000004163 11406226635 016706 0ustar00hecht000000 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.26-2/src/bamglib/SetOfE4.h000644 000767 000767 00000003365 11406142256 016352 0ustar00hecht000000 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.26-2/src/bamg/bamg.cpp000644 000767 000767 00000071233 11406226635 015716 0ustar00hecht000000 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.26-2/src/bamg/global.cpp000644 000767 000767 00000000076 12021733446 016242 0ustar00hecht000000 000000 long verbosity=1; long mpirank =0; void ShowDebugStack(){} freefem++-3.26-2/src/bamg/Makefile.am000644 000767 000767 00000002341 12140703536 016326 0ustar00hecht000000 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 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 #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 AM_CPPFLAGS=-I$(srcdir)/../fflib -I$(srcdir)/../bamglib -I$(srcdir)/../Graphics freefem++-3.26-2/src/bamg/Makefile.in000644 000767 000767 00000054230 12245613204 016341 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 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 #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 AM_CPPFLAGS = -I$(srcdir)/../fflib -I$(srcdir)/../bamglib -I$(srcdir)/../Graphics 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 .PRECIOUS: 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 # 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.26-2/src/Algo/BFGS.hpp000644 000767 000767 00000010257 11406226635 015511 0ustar00hecht000000 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.26-2/src/Algo/BrentLS.hpp000644 000767 000767 00000022411 11406226635 016274 0ustar00hecht000000 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.26-2/src/Algo/CG.hpp000644 000767 000767 00000014644 11406226635 015265 0ustar00hecht000000 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.26-2/src/Algo/CubicLS.hpp000644 000767 000767 00000012057 11705630521 016247 0ustar00hecht000000 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.26-2/src/Algo/defs.hpp000644 000767 000767 00000004515 11406226635 015711 0ustar00hecht000000 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.26-2/src/Algo/lgalgo.cpp000644 000767 000767 00000020576 11645651133 016235 0ustar00hecht000000 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.26-2/src/Algo/LineSearch.hpp000644 000767 000767 00000014734 11406226635 017011 0ustar00hecht000000 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.26-2/src/Algo/Makefile.am000644 000767 000767 00000000543 11406142256 016304 0ustar00hecht000000 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.26-2/src/Algo/Makefile.in000644 000767 000767 00000035550 12245613204 016321 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 .PRECIOUS: 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 # 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.26-2/src/Algo/NewtonRaphson.hpp000644 000767 000767 00000005144 11406226635 017574 0ustar00hecht000000 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.26-2/src/Algo/NRJ.hpp000644 000767 000767 00000004267 11406226635 015425 0ustar00hecht000000 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.26-2/src/Algo/Optima.hpp000644 000767 000767 00000004545 11406226635 016224 0ustar00hecht000000 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.26-2/src/Algo/Param.hpp000644 000767 000767 00000010723 11406226635 016026 0ustar00hecht000000 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.26-2/src/Algo/RosenBrock.hpp000644 000767 000767 00000004540 11406226635 017035 0ustar00hecht000000 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.26-2/examples-bamg/NACA012/000755 000767 000767 00000000000 12245613623 016247 5ustar00hecht000000 000000 freefem++-3.26-2/examples-bamg/quadloop/000755 000767 000767 00000000000 12245613623 017146 5ustar00hecht000000 000000 freefem++-3.26-2/examples-bamg/square/000755 000767 000767 00000000000 12245613623 016622 5ustar00hecht000000 000000 freefem++-3.26-2/examples-bamg/test/000755 000767 000767 00000000000 12245613623 016301 5ustar00hecht000000 000000 freefem++-3.26-2/examples-bamg/test/dotest.pl000755 000767 000767 00000007663 11406142255 020153 0ustar00hecht000000 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.26-2/examples-bamg/square/circle_g.mesh000644 000767 000767 00000000541 11406142255 021243 0ustar00hecht000000 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.26-2/examples-bamg/square/doadapt000755 000767 000767 00000002073 11406142255 020162 0ustar00hecht000000 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.26-2/examples-bamg/square/dotest000755 000767 000767 00000004434 11406142255 020053 0ustar00hecht000000 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.26-2/examples-bamg/square/l_g.mesh000644 000767 000767 00000015352 11406142255 020243 0ustar00hecht000000 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.26-2/examples-bamg/square/octogone_g.mesh000644 000767 000767 00000000541 11406142255 021617 0ustar00hecht000000 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.26-2/examples-bamg/square/square_g.mesh000644 000767 000767 00000000224 11406142255 021300 0ustar00hecht000000 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.26-2/examples-bamg/square/square_raf_ani_g.mtr000644 000767 000767 00000000056 11406142255 022630 0ustar00hecht000000 000000 5 3 500 0 25 25 0 25 25 0 25 25 0 25 25 0 100 freefem++-3.26-2/examples-bamg/square/square_raf_g.mesh000644 000767 000767 00000000506 11406142255 022133 0ustar00hecht000000 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.26-2/examples-bamg/square/square_raf_g.mtr000644 000767 000767 00000000041 11406142255 021773 0ustar00hecht000000 000000 5 1 0.666 0.666 0.666 0.666 0.01 freefem++-3.26-2/examples-bamg/quadloop/dotest.pl000755 000767 000767 00000010454 11535703040 021006 0ustar00hecht000000 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.26-2/examples-bamg/NACA012/ad.sh000755 000767 000767 00000004556 11406142255 017200 0ustar00hecht000000 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.26-2/examples-bamg/NACA012/adap.sh000755 000767 000767 00000005040 11406142255 017506 0ustar00hecht000000 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.26-2/examples-bamg/NACA012/adap.sh-g000755 000767 000767 00000004743 11406142255 017743 0ustar00hecht000000 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.26-2/examples-bamg/NACA012/data000644 000767 000767 00000002700 11406142255 017076 0ustar00hecht000000 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.26-2/examples-bamg/NACA012/data-orign000644 000767 000767 00000002677 11406142255 020227 0ustar00hecht000000 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.26-2/examples-bamg/NACA012/naca.awk000644 000767 000767 00000001644 11406142255 017656 0ustar00hecht000000 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.26-2/examples++-tutorial/aile.msh000644 000767 000767 00000025104 12214310341 020015 0ustar00hecht000000 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.26-2/examples++-tutorial/algo.edp000644 000767 000767 00000011120 11460276434 020017 0ustar00hecht000000 000000 // cleanning version 07/2008 FH in Sevilla. real umax=0; { // 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); 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; } { // 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.26-2/examples++-tutorial/BEM.edp000644 000767 000767 00000005501 11406142255 017477 0ustar00hecht000000 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.26-2/examples++-tutorial/calculus.edp000644 000767 000767 00000002651 12167254041 020714 0ustar00hecht000000 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.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); 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.26-2/examples++-tutorial/convect-apt.edp000755 000767 000767 00000005175 11540140006 021320 0ustar00hecht000000 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.26-2/examples++-tutorial/exception.edp000644 000767 000767 00000001570 11406142255 021074 0ustar00hecht000000 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.26-2/examples++-tutorial/FE.edp000644 000767 000767 00000002315 11406142255 017366 0ustar00hecht000000 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.26-2/examples++-tutorial/._fluidStructAdapt.edp000644 000767 000024 00000000253 12104206102 023564 0ustar00hechtstaff000000 000000 Mac OS X  2yFRAdSMULATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/examples++-tutorial/fluidStructAdapt.edp000644 000767 000767 00000010507 12104206102 022344 0ustar00hecht000000 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.26-2/examples++-tutorial/freeboundary-weak.edp000755 000767 000767 00000004702 12167254041 022515 0ustar00hecht000000 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.26-2/examples++-tutorial/._LapDG2.edp000644 000767 000024 00000000253 12072765664 021346 0ustar00hechtstaff000000 000000 Mac OS X  2yFRAdSMULATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/examples++-tutorial/LapDG2.edp000644 000767 000767 00000003562 12072765664 020131 0ustar00hecht000000 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*x*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.26-2/examples++-tutorial/Laplace-lagrange-mult.edp000644 000767 000767 00000002100 11406142255 023162 0ustar00hecht000000 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.26-2/examples++-tutorial/Laplace-RHS-Dirac.edp000644 000767 000767 00000002452 12167254041 022113 0ustar00hecht000000 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 < $@ # 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.26-2/examples++-tutorial/Makefile.in000644 000767 000767 00000135124 12245613203 020452 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/depcomp \ $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 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 .PRECIOUS: 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 # exand 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; \ else \ 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) .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 -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 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 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 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.26-2/examples++-tutorial/mat_interpol.edp000644 000767 000767 00000003524 11625711166 021602 0ustar00hecht000000 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); fespace Vh(Th,P1); Vh u; int i,n=u.n; u=0; for (i=0;i1e-10,split=5,label=2); plot(Th,Shi,wait=1,ps="trunc"+i+".eps"); 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.26-2/examples++-tutorial/Newton.edp000644 000767 000767 00000004541 12167254041 020353 0ustar00hecht000000 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.26-2/examples++-tutorial/nl-elast-neo-Hookean.edp000644 000767 000767 00000032632 11406142255 022761 0ustar00hecht000000 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"); 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.26-2/examples++-tutorial/ref.edp000644 000767 000767 00000002052 12107167667 017663 0ustar00hecht000000 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.26-2/examples++-tutorial/region.edp000644 000767 000767 00000002110 11406142255 020350 0ustar00hecht000000 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.26-2/examples++-tutorial/regtests.edp000644 000767 000767 00000032303 12105735621 020736 0ustar00hecht000000 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.26-2/examples++-tutorial/schwarz-gc.edp000644 000767 000767 00000004042 11406142255 021143 0ustar00hecht000000 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.26-2/examples++-tutorial/schwarz-no-overlap.edp000644 000767 000767 00000002135 12167254041 022637 0ustar00hecht000000 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.26-2/examples++-tutorial/schwarz-overlap.edp000644 000767 000767 00000001742 11406142255 022226 0ustar00hecht000000 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.26-2/examples++-tutorial/shur-comp.edp000644 000767 000767 00000007657 11406142255 021027 0ustar00hecht000000 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.26-2/examples++-tutorial/sparse-cmatrix.edp000644 000767 000767 00000007651 12167254041 022050 0ustar00hecht000000 000000 // sparse matrix test --- // example of the new matrix feature in version 1.40 // ------------------------------------------------- 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; freefem++-3.26-2/examples++-tutorial/._sphere.edp000644 000767 000024 00000000253 12131740110 021572 0ustar00hechtstaff000000 000000 Mac OS X  2yFRAdSMULATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/examples++-tutorial/sphere.edp000644 000767 000767 00000002275 12131740110 020355 0ustar00hecht000000 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.26-2/examples++-tutorial/StokesUzawa.edp000644 000767 000767 00000001620 11406142255 021352 0ustar00hecht000000 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.26-2/examples++-tutorial/string.edp000644 000767 000767 00000002706 11406142255 020406 0ustar00hecht000000 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.26-2/examples++-other/lap3-cpu.edp000644 000767 000767 00000006362 12167254041 020006 0ustar00hecht000000 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.26-2/examples++-other/Makefile.am000644 000767 000767 00000000241 12152204465 017711 0ustar00hecht000000 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.26-2/examples++-other/Makefile.in000644 000767 000767 00000070100 12245613203 017720 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 .PRECIOUS: 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 # exand 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; \ else \ 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 # 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.26-2/examples++-other/speedtest.sh000755 000767 000767 00000001066 11406142255 020221 0ustar00hecht000000 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.26-2/examples++-mpi/AddLayer2d.idp000644 000767 000767 00000003131 11745333166 017743 0ustar00hecht000000 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.26-2/examples++-mpi/AddLayer3d.idp000644 000767 000767 00000003204 11745333166 017745 0ustar00hecht000000 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.26-2/examples++-mpi/beam-3d-matrix-pastix.edp000644 000767 000767 00000004201 11745333166 022043 0ustar00hecht000000 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.26-2/examples++-mpi/chaleur3D-hips.edp000644 000767 000767 00000000415 11745333166 020601 0ustar00hecht000000 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.26-2/examples++-mpi/chaleur3D-hypre.edp000644 000767 000767 00000005172 11745333166 020772 0ustar00hecht000000 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_long_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; } LOADINIT(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.26-2/examples++-mpi/complex_SuperLU_DIST_FreeFem.cpp000644 000767 000767 00000060035 12167254041 023337 0ustar00hecht000000 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 blas parmetis mpi 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); } 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; } LOADINIT(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.26-2/examples++-mpi/DDM-funcs-v2.idp000644 000767 000767 00000014415 11745333166 020104 0ustar00hecht000000 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; 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=1; // size of overlap bool 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(nupart,Thg,npart); broadcast(processor(0,comm),nupart); for(int i=0;i10&& mpirank==0) plot(part,fill=1,cmm="dual",wait=1); /* overlapping partition */ Phg suppi= abs(part-ipart)<0.1; Vhg unssd; /* boolean function 1 in the subdomain 0 elswhere */ Thin=trunc(Thg,suppi>0,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 int npij=npart; Vhi[int] pij(npij);/* local partition of unit + 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(dplot1) plot(pii,wait=1,cmm=" 0000"); 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[],nlayer,phii[]); 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,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; // /******************************************************************/ // usage uplot is allu or [allu,allu1] : macro PLOTMPIALLU(mesh,Pk,defPk, Th, u, uplot, plotparm) { int ver=verbosity; verbosity=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 // /* 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.26-2/examples++-mpi/dSuperLU_DIST.cpp000644 000767 000767 00000051357 12167254041 020372 0ustar00hecht000000 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)); } 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; } LOADINIT(Init); Init::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)); } freefem++-3.26-2/examples++-mpi/essai-com.edp000644 000767 000767 00000001502 12167254041 017675 0ustar00hecht000000 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.26-2/examples++-mpi/essai.edp000644 000767 000767 00000007347 11745333166 017145 0ustar00hecht000000 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.26-2/examples++-mpi/ffsuperludistoption.hpp000644 000767 000767 00000042715 11745333363 022205 0ustar00hecht000000 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.26-2/examples++-mpi/generaldefs.h000755 000767 000767 00000005142 11745333166 017771 0ustar00hecht000000 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.26-2/examples++-mpi/getARGV.idp000644 000767 000767 00000004175 11745333166 017300 0ustar00hecht000000 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.26-2/examples++-mpi/Heat3d.idp000644 000767 000767 00000006133 11745333166 017145 0ustar00hecht000000 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",20); 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" { #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; 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, MPI_Comm * mpicommw ) : eps(eeps),data_option(datafile) ,param_int(17), param_double(6),id(GetId()) { 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,(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 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; } LOADINIT(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)); if(! Global.Find("HipsDefaults").NotNull() ) Global.Add("HipsDefaults","(",new OneOperator2*,KN *>(HipsDefaults)); } freefem++-3.26-2/examples++-mpi/hypre_FreeFem.cpp000644 000767 000767 00000160705 12167254041 020562 0ustar00hecht000000 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); } 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; } LOADINIT(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.26-2/examples++-mpi/interfacepastix.cpp000644 000767 000767 00000037574 12167254041 021242 0ustar00hecht000000 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); } 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; } LOADINIT(Init); Init::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)); } freefem++-3.26-2/examples++-mpi/Laplace3d-hips.edp000644 000767 000767 00000005245 11745333166 020565 0ustar00hecht000000 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; 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 *.$(DYLIB_SUFFIX) -rm *.$(OBJEXT) # Local Variables: # mode:makefile # ispell-local-dictionary:"british" # coding:utf-8 # End: freefem++-3.26-2/examples++-mpi/Makefile.in000644 000767 000767 00000122364 12245613203 017376 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 = 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 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 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 # 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) 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 .PRECIOUS: 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 # exand 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; \ else \ 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 $$? 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) .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 # 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 $(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; 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 *.$(DYLIB_SUFFIX) -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.26-2/examples++-mpi/mortar-DN-4-mpi.edp000644 000767 000767 00000011651 11745333166 020561 0ustar00hecht000000 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.26-2/examples++-mpi/mortar-msh.idp000644 000767 000767 00000002341 11745333166 020123 0ustar00hecht000000 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) } }; class Init { public: Init(); }; static Init init; // une variable globale qui serat construite au chargement dynamique Init::Init() { Global.Add("cmaesMPI","(",new OptimCMA_ES(1)); } freefem++-3.26-2/examples++-mpi/MPICG.cpp000644 000767 000767 00000034617 12243220323 016672 0ustar00hecht000000 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) } }; class Init { public: Init(); }; LOADINIT(Init); Init::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 } freefem++-3.26-2/examples++-mpi/MPICGLap.edp000644 000767 000767 00000010515 11745333166 017324 0ustar00hecht000000 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.26-2/examples++-mpi/MPIGMRES2D.edp000644 000767 000767 00000031376 11745333166 017451 0ustar00hecht000000 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 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;}}; 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); _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; } } _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 && mat) return new SolverMumps(*A, ds.lparams, ds.dparams, pcw,strategy,matrank); else { MatriceMorse empty; return new SolverMumps(empty, ds.lparams, ds.dparams, (MPI_Comm*)ds.commworld,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.26-2/examples++-mpi/MUMPS.edp000755 000767 000767 00000003574 12134242743 016734 0ustar00hecht000000 000000 load "MUMPS" load "symmetrizeCSR" int[int] l = [1, 1, 2, 2]; mesh Th = square(150, 150, label = l); int master = 0; // no choose se 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 = lap(Vh, Vh); matrix 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 == 1 // 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 distribu 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); 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.26-2/examples++-mpi/MUMPS_FreeFem.cpp000644 000767 000767 00000211565 12214307167 020336 0ustar00hecht000000 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 parmetis ptscotch 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); 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)); } 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"); freefem++-3.26-2/examples++-mpi/NSI3d-carac-mumps.edp000644 000767 000767 00000011152 11745333166 021114 0ustar00hecht000000 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]] #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[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; } LOADINIT(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.26-2/examples++-mpi/real_pastix_FreeFem.cpp000644 000767 000767 00000052717 12167254041 021751 0ustar00hecht000000 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); } 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; } LOADINIT(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.26-2/examples++-mpi/real_SuperLU_DIST_FreeFem.cpp000644 000767 000767 00000055635 12167254041 022625 0ustar00hecht000000 000000 // for automatic compilation with ff-c++ //ff-c++-LIBRARY-dep: superlu_dist blas parmetis metis mpi 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); } 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; } LOADINIT(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.26-2/examples++-mpi/regtests.sh000755 000767 000767 00000000750 11745333166 017535 0ustar00hecht000000 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.26-2/examples++-mpi/schwarz-3.edp000644 000767 000767 00000004235 11745333166 017653 0ustar00hecht000000 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.26-2/examples++-mpi/schwarz-b.edp000644 000767 000767 00000003535 11745333166 017734 0ustar00hecht000000 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.26-2/examples++-mpi/schwarz-c.edp000644 000767 000767 00000003356 11745333166 017736 0ustar00hecht000000 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.26-2/examples++-mpi/schwarz.edp000644 000767 000767 00000002752 11745333166 017515 0ustar00hecht000000 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.26-2/examples++-mpi/Stokes-v1-matrix-mumps.edp000644 000767 000767 00000004317 12240775536 022272 0ustar00hecht000000 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",20); 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.26-2/examples++-mpi/Stokes-v1-matrix-pastix.edp000644 000767 000767 00000003355 12163101722 022422 0ustar00hecht000000 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.26-2/examples++-mpi/Stokes-v1-matrix-superludist.edp000644 000767 000767 00000003357 12163101752 023502 0ustar00hecht000000 000000 // other load "msh3" load "medit" load "real_SuperLU_DIST_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.26-2/examples++-mpi/Stokes-v2-matrix-mumps.edp000644 000767 000767 00000004555 12163102024 022253 0ustar00hecht000000 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.26-2/examples++-mpi/testsolver_pastix.edp000644 000767 000767 00000013347 11745333166 021640 0ustar00hecht000000 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;jnom = 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(); }; LOADINIT(Init); Init::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) ); } freefem++-3.26-2/examples++-load/all.edp000644 000767 000767 00000053726 12165315734 016743 0ustar00hecht000000 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.26-2/examples++-load/._APk-AdaptEpsDeltaPk.edp000755 000767 000024 00000000252 12052701007 023005 0ustar00hechtstaff000000 000000 Mac OS X  2xFRAdSMULATTRcom.apple.TextEncodingiso-8859-1;513freefem++-3.26-2/examples++-load/APk-AdaptEpsDeltaPk.edp000755 000767 000767 00000002536 12052701007 021571 0ustar00hecht000000 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.26-2/examples++-load/._APk-MetricPk.edp000755 000767 000024 00000002662 11714271311 021570 0ustar00hechtstaff000000 000000 Mac OS X  2Fx:SMLdSMULATTRxx2./Applications/Smultron.localized/Smultron.app2 2usro freefem++-3.26-2/examples++-load/APk-MetricPk.edp000755 000767 000767 00000002035 11714271311 020337 0ustar00hecht000000 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.26-2/examples++-load/BasicMath.h000755 000767 000767 00000011152 11714503427 017470 0ustar00hecht000000 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.26-2/examples++-load/BernadiRaugel.cpp000644 000767 000767 00000017200 11406142255 020665 0ustar00hecht000000 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 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(); }; LOADINIT(Init); Init::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)); } freefem++-3.26-2/examples++-load/bmo.cpp000644 000767 000767 00000030542 11406142255 016742 0ustar00hecht000000 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.26-2/examples++-load/bmo.edp000644 000767 000767 00000001347 11406142255 016731 0ustar00hecht000000 000000 load "./lgbmo" int n=2; real[int] X(n),DX(n); real[int] X0(n); 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.26-2/examples++-load/._cmaes.h000644 000767 000024 00000000424 11650032724 020141 0ustar00hechtstaff000000 000000 Mac OS X  2ATTRXcom.apple.TextEncodingIcom.apple.quarantineutf-8;134217984q/0001;4e9fe609;Mail;76D0D5E7-2059-4A5F-B61F-935ECF72962A|com.apple.mailfreefem++-3.26-2/examples++-load/cmaes.h000644 000767 000767 00000010375 11650032724 016724 0ustar00hecht000000 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.26-2/examples++-load/._cmaes_interface.h000644 000767 000024 00000000341 11650032724 022157 0ustar00hechtstaff000000 000000 Mac OS X  2ATTRIIcom.apple.quarantineq/0001;4e9fe609;Mail;76D0D5E7-2059-4A5F-B61F-935ECF72962A|com.apple.mailfreefem++-3.26-2/examples++-load/cmaes_interface.h000644 000767 000767 00000004442 11650032724 020742 0ustar00hecht000000 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.26-2/examples++-load/convect_dervieux.edp000644 000767 000767 00000001762 12167254041 021533 0ustar00hecht000000 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.26-2/examples++-load/convectchacon-3d.edp000644 000767 000767 00000001760 11643536043 021301 0ustar00hecht000000 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.26-2/examples++-load/convectchacon.edp000644 000767 000767 00000001557 11406142255 020774 0ustar00hecht000000 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.26-2/examples++-load/convexehull3d.edp000644 000767 000767 00000000146 12120656017 020733 0ustar00hecht000000 000000 load "tetgen" mesh3 Th=tetgconvexhull("ch.pts",region=1,label=3);//,reftet=1, refface=1); plot(Th); freefem++-3.26-2/examples++-load/cube.msh000644 000767 000767 00000036170 11406142255 017113 0ustar00hecht000000 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.26-2/examples++-load/dfft.cpp000644 000767 000767 00000020426 12131470110 017076 0ustar00hecht000000 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; } LOADINIT(Init); Init::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)); } freefem++-3.26-2/examples++-load/dfft.edp000644 000767 000767 00000004153 12131467023 017074 0ustar00hecht000000 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.26-2/examples++-load/dmatrix.hpp000755 000767 000767 00000006267 12115121001 017634 0ustar00hecht000000 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.26-2/examples++-load/DxWriter.cpp000644 000767 000767 00000025057 12167254041 017744 0ustar00hecht000000 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(); }; LOADINIT(Init); Init::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)); } freefem++-3.26-2/examples++-load/Element_Mixte.cpp000644 000767 000767 00000072211 11567715231 020733 0ustar00hecht000000 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 //ff-c++-LIBRARY-dep: 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; 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 & 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.26-2/examples++-load/._Element_P3.cpp000644 000767 000024 00000000253 11746441270 021345 0ustar00hechtstaff000000 000000 Mac OS X  2yATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/examples++-load/Element_P3.cpp000644 000767 000767 00000012632 11746441270 020126 0ustar00hecht000000 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 if(K.EdgeOrientation(ee) <0.) xe = 1-xe; //cout << P << " ee = " << ee << " xe " << xe << " " << L[ee]<< " s=" < 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.26-2/examples++-load/ff-cmaes.cpp000644 000767 000767 00000025753 11654763720 017671 0ustar00hecht000000 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(); }; LOADINIT(Init); // une variable globale qui serat construite au chargement dynamique Init::Init() { Global.Add("cmaes","(",new OptimCMA_ES(1)); } freefem++-3.26-2/examples++-load/ff-get-dep.in000755 000767 000767 00000003725 12245611223 017733 0ustar00hecht000000 000000 #!/bin/sh # ff-c++ `./ff-get-dep -ff metis.cpp` case "$1" in -dlib) shift awk -F: '/ff-c[+][+]-LIBRARY-dep/ { print $2}' $@ exit 0; ;; -dcpp) shift awk -F: '/ff-c[+][+]-cpp-dep/ { print $2}' $@ echo $@ exit 0; ;; -ff) shift; libs=`$0 -dlib $@` cpp=`$0 -dcpp $@` inclins=`$0 -i $libs` ldlibs=`$0 -l $libs` if [ -n "$ldlibs" -o -z "$libs" ]; then echo "$cpp" "$inclins" "$ldlibs" else # FFCS - we need errors returns to insure that all compilations run well. ERROR is detected by ff-c++ echo "ERROR: find libs of $0 : $libs " fi exit 0; ;; esac dircommand=`dirname $0` if [ -f "WHERE_LIBRARY-download" ] ; then dirwhere=. 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" case "$1" in -i*) shift; for i in $@ ; do # echo "$1" # echo awk -v p="$1" -v m=INCLUDE ' ($1 == p) && ($2 == m) { for (i=3;i<=NF;++i) {print $i," ";}}' WHERE_LIBRARY WHERE_LIBRARY-download # FFCS: print everything on the same line to avoid splitting paths containing spaces awk -v p="$i" -v m=INCLUDE ' ($1 == p) && ($2 == m) && (!first){ first=1;for (i=3;i<=NF;++i) {printf("%s ",$i);}}' $wherel done ;; -l*) shift; for i in $@ ; do # FFCS: print everything on the same line to avoid splitting paths containing spaces awk -v p="$i" -v m=LD ' ($1 == p) && ($2 == m) && (!first) {first=1; for (i=3;i<=NF;++i) {printf("%s ",$i);}} END { if(!first) print "ERROR-missing-lib:" p;} ' $wherel done ;; *) for i in $@ ; do awk -v p="$i" ' ($1 == p) { k=0; for (i=3;i<=NF;++i) {k=1;} print k}' $wherel done shift;; esac freefem++-3.26-2/examples++-load/._ff-Ipopt.cpp000644 000767 000024 00000000253 12206620117 021065 0ustar00hechtstaff000000 000000 Mac OS X  2yATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/examples++-load/ff-Ipopt.cpp000644 000767 000767 00000240665 12206620117 017657 0ustar00hecht000000 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; *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(!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; Init::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}; */ freefem++-3.26-2/examples++-load/._ff-NLopt.cpp000644 000767 000024 00000000253 12021145052 021021 0ustar00hechtstaff000000 000000 Mac OS X  2yTEXTATTRcom.apple.TextEncodingUTF-8;134217984freefem++-3.26-2/examples++-load/ff-NLopt.cpp000644 000767 000767 00000124112 12021145052 017577 0ustar00hecht000000 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(); }; LOADINIT(Init); // une variable globale qui serat construite au chargement dynamique Init::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)); } freefem++-3.26-2/examples++-load/ff-pkg-download.in000755 000767 000767 00000002773 12243207431 020776 0ustar00hecht000000 000000 #!/bin/sh 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" elif [ -d "$DESTDIR$DIRP/lib" -a -d "$DESTDIR$DIRP/include" ] ; then DIR="$DIRP" else DIR=@ff_prefix_dir@ 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 # return for la in arpack umfpack amd fftw3 blas lapack mmg3d; do l=`echo $la |sed -e s/^tet$/tetgen/` if [ ! -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 fifreefem++-3.26-2/examples++-load/ff_gsl_awk.hpp000644 000767 000767 00000070634 11513606075 020306 0ustar00hecht000000 000000 /* minssing gsl_sf_coulomb.h:double gsl_sf_hydrogenicR(const int n, const int l, const double Z, const double r); minssing gsl_sf_coupling.h:double gsl_sf_coupling_3j(int two_ja, int two_jb, int two_jc, minssing gsl_sf_coupling.h:double gsl_sf_coupling_6j(int two_ja, int two_jb, int two_jc, minssing gsl_sf_coupling.h:double gsl_sf_coupling_RacahW(int two_ja, int two_jb, int two_jc, minssing gsl_sf_coupling.h:double gsl_sf_coupling_9j(int two_ja, int two_jb, int two_jc, minssing gsl_sf_coupling.h:double gsl_sf_coupling_6j_INCORRECT(int two_ja, int two_jb, int two_jc, minssing gsl_sf_ellint.h:double gsl_sf_ellint_Pcomp(double k, double n, gsl_mode_t mode); minssing gsl_sf_ellint.h:double gsl_sf_ellint_F(double phi, double k, gsl_mode_t mode); minssing gsl_sf_ellint.h:double gsl_sf_ellint_E(double phi, double k, gsl_mode_t mode); minssing gsl_sf_ellint.h:double gsl_sf_ellint_P(double phi, double k, double n, gsl_mode_t mode); minssing gsl_sf_ellint.h:double gsl_sf_ellint_D(double phi, double k, double n, gsl_mode_t mode); minssing gsl_sf_ellint.h:double gsl_sf_ellint_RC(double x, double y, gsl_mode_t mode); minssing gsl_sf_ellint.h:double gsl_sf_ellint_RD(double x, double y, double z, gsl_mode_t mode); minssing gsl_sf_ellint.h:double gsl_sf_ellint_RF(double x, double y, double z, gsl_mode_t mode); minssing gsl_sf_ellint.h:double gsl_sf_ellint_RJ(double x, double y, double z, double p, gsl_mode_t mode); minssing gsl_sf_gamma.h:double gsl_sf_beta_inc(const double a, const double b, const double x); minssing gsl_sf_gegenbauer.h:double gsl_sf_gegenpoly_n(int n, double lambda, double x); minssing gsl_sf_hyperg.h:double gsl_sf_hyperg_1F1_int(const int m, const int n, double x); minssing gsl_sf_hyperg.h:double gsl_sf_hyperg_1F1(double a, double b, double x); minssing gsl_sf_hyperg.h:double gsl_sf_hyperg_U_int(const int m, const int n, const double x); minssing gsl_sf_hyperg.h:double gsl_sf_hyperg_U(const double a, const double b, const double x); minssing gsl_sf_hyperg.h:double gsl_sf_hyperg_2F1(double a, double b, double c, double x); minssing gsl_sf_hyperg.h:double gsl_sf_hyperg_2F1_conj(double aR, double aI, double c, double x); minssing gsl_sf_hyperg.h:double gsl_sf_hyperg_2F1_renorm(double a, double b, double c, double x); minssing gsl_sf_hyperg.h:double gsl_sf_hyperg_2F1_conj_renorm(double aR, double aI, double c, double x); minssing gsl_sf_hyperg.h:double gsl_sf_hyperg_2F0(const double a, const double b, const double x); minssing gsl_sf_laguerre.h:double gsl_sf_laguerre_n(int n, double a, double x); minssing gsl_sf_legendre.h:double gsl_sf_legendre_Plm(const int l, const int m, const double x); minssing gsl_sf_legendre.h:double gsl_sf_legendre_sphPlm(const int l, const int m, const double x); minssing gsl_sf_legendre.h:double gsl_sf_conicalP_sph_reg(const int l, const double lambda, const double x); minssing gsl_sf_legendre.h:double gsl_sf_conicalP_cyl_reg(const int m, const double lambda, const double x); minssing gsl_sf_legendre.h:double gsl_sf_legendre_H3d(const int l, const double lambda, const double eta); */ /*****************/ /*****************/ double gsl_sf_airy_Ai( double x, long y ) { return gsl_sf_airy_Ai( ( const double) x, ( gsl_mode_t) y );} double gsl_sf_airy_Bi( double x, long y ) { return gsl_sf_airy_Bi( ( const double) x, ( gsl_mode_t) y );} double gsl_sf_airy_Ai_scaled( double x, long y ) { return gsl_sf_airy_Ai_scaled( ( const double) x, ( gsl_mode_t) y );} double gsl_sf_airy_Bi_scaled( double x, long y ) { return gsl_sf_airy_Bi_scaled( ( const double) x, ( gsl_mode_t) y );} double gsl_sf_airy_Ai_deriv( double x, long y ) { return gsl_sf_airy_Ai_deriv( ( const double) x, ( gsl_mode_t) y );} double gsl_sf_airy_Bi_deriv( double x, long y ) { return gsl_sf_airy_Bi_deriv( ( const double) x, ( gsl_mode_t) y );} double gsl_sf_airy_Ai_deriv_scaled( double x, long y ) { return gsl_sf_airy_Ai_deriv_scaled( ( const double) x, ( gsl_mode_t) y );} double gsl_sf_airy_Bi_deriv_scaled( double x, long y ) { return gsl_sf_airy_Bi_deriv_scaled( ( const double) x, ( gsl_mode_t) y );} double gsl_sf_airy_zero_Ai( long x ) { return gsl_sf_airy_zero_Ai( ( unsigned int) x );} double gsl_sf_airy_zero_Bi( long x ) { return gsl_sf_airy_zero_Bi( ( unsigned int) x );} double gsl_sf_airy_zero_Ai_deriv( long x ) { return gsl_sf_airy_zero_Ai_deriv( ( unsigned int) x );} double gsl_sf_airy_zero_Bi_deriv( long x ) { return gsl_sf_airy_zero_Bi_deriv( ( unsigned int) x );} double gsl_sf_bessel_Jn( long x, double y ) { return gsl_sf_bessel_Jn( ( const int) x, ( const double) y );} double gsl_sf_bessel_Yn( long x, double y ) { return gsl_sf_bessel_Yn( ( const int) x, ( const double) y );} double gsl_sf_bessel_In( long x, double y ) { return gsl_sf_bessel_In( ( const int) x, ( const double) y );} double gsl_sf_bessel_In_scaled( long x, double y ) { return gsl_sf_bessel_In_scaled( ( const int) x, ( const double) y );} double gsl_sf_bessel_Kn( long x, double y ) { return gsl_sf_bessel_Kn( ( const int) x, ( const double) y );} double gsl_sf_bessel_Kn_scaled( long x, double y ) { return gsl_sf_bessel_Kn_scaled( ( const int) x, ( const double) y );} double gsl_sf_bessel_jl( long x, double y ) { return gsl_sf_bessel_jl( ( const int) x, ( const double) y );} double gsl_sf_bessel_yl( long x, double y ) { return gsl_sf_bessel_yl( ( const int) x, ( const double) y );} double gsl_sf_bessel_il_scaled( long x, double y ) { return gsl_sf_bessel_il_scaled( ( const int) x, ( const double) y );} double gsl_sf_bessel_kl_scaled( long x, double y ) { return gsl_sf_bessel_kl_scaled( ( const int) x, ( const double) y );} double gsl_sf_bessel_Jnu( double x, long y ) { return gsl_sf_bessel_Jnu( ( const double) x, ( const double) y );} double gsl_sf_bessel_Ynu( double x, long y ) { return gsl_sf_bessel_Ynu( ( const double) x, ( const double) y );} double gsl_sf_bessel_Inu_scaled( double x, long y ) { return gsl_sf_bessel_Inu_scaled( ( double) x, ( double) y );} double gsl_sf_bessel_Inu( double x, long y ) { return gsl_sf_bessel_Inu( ( double) x, ( double) y );} double gsl_sf_bessel_Knu_scaled( double x, long y ) { return gsl_sf_bessel_Knu_scaled( ( const double) x, ( const double) y );} double gsl_sf_bessel_Knu( double x, long y ) { return gsl_sf_bessel_Knu( ( const double) x, ( const double) y );} double gsl_sf_bessel_lnKnu( double x, long y ) { return gsl_sf_bessel_lnKnu( ( const double) x, ( const double) y );} double gsl_sf_bessel_zero_J0( long x ) { return gsl_sf_bessel_zero_J0( ( unsigned int) x );} double gsl_sf_bessel_zero_J1( long x ) { return gsl_sf_bessel_zero_J1( ( unsigned int) x );} double gsl_sf_bessel_zero_Jnu( double x, long y ) { return gsl_sf_bessel_zero_Jnu( ( double) x, ( unsigned int) y );} double gsl_sf_hydrogenicR_1( double x, long y ) { return gsl_sf_hydrogenicR_1( ( const double) x, ( const double) y );} double gsl_sf_multiply( double x, long y ) { return gsl_sf_multiply( ( const double) x, ( const double) y );} double gsl_sf_ellint_Kcomp( double x, long y ) { return gsl_sf_ellint_Kcomp( ( double) x, ( gsl_mode_t) y );} double gsl_sf_ellint_Ecomp( double x, long y ) { return gsl_sf_ellint_Ecomp( ( double) x, ( gsl_mode_t) y );} double gsl_sf_ellint_Dcomp( double x, long y ) { return gsl_sf_ellint_Dcomp( ( double) x, ( gsl_mode_t) y );} double gsl_sf_exp_mult( double x, long y ) { return gsl_sf_exp_mult( ( const double) x, ( const double) y );} double gsl_sf_exprel_n( long x, double y ) { return gsl_sf_exprel_n( ( const int) x, ( const double) y );} double gsl_sf_expint_En( long x, double y ) { return gsl_sf_expint_En( ( const int) x, ( const double) y );} double gsl_sf_expint_En_scaled( long x, double y ) { return gsl_sf_expint_En_scaled( ( const int) x, ( const double) y );} double gsl_sf_fermi_dirac_int( long x, double y ) { return gsl_sf_fermi_dirac_int( ( const int) x, ( const double) y );} double gsl_sf_fermi_dirac_inc_0( double x, long y ) { return gsl_sf_fermi_dirac_inc_0( ( const double) x, ( const double) y );} double gsl_sf_taylorcoeff( long x, double y ) { return gsl_sf_taylorcoeff( ( const int) x, ( const double) y );} double gsl_sf_fact( long x ) { return gsl_sf_fact( ( const unsigned int) x );} double gsl_sf_doublefact( long x ) { return gsl_sf_doublefact( ( const unsigned int) x );} double gsl_sf_lnfact( long x ) { return gsl_sf_lnfact( ( const unsigned int) x );} double gsl_sf_lndoublefact( long x ) { return gsl_sf_lndoublefact( ( const unsigned int) x );} double gsl_sf_lnchoose( long x, long y ) { return gsl_sf_lnchoose( ( unsigned int) x, ( unsigned int) y );} double gsl_sf_choose( long x, long y ) { return gsl_sf_choose( ( unsigned int) x, ( unsigned int) y );} double gsl_sf_lnpoch( double x, long y ) { return gsl_sf_lnpoch( ( const double) x, ( const double) y );} double gsl_sf_poch( double x, long y ) { return gsl_sf_poch( ( const double) x, ( const double) y );} double gsl_sf_pochrel( double x, long y ) { return gsl_sf_pochrel( ( const double) x, ( const double) y );} double gsl_sf_gamma_inc_Q( double x, long y ) { return gsl_sf_gamma_inc_Q( ( const double) x, ( const double) y );} double gsl_sf_gamma_inc_P( double x, long y ) { return gsl_sf_gamma_inc_P( ( const double) x, ( const double) y );} double gsl_sf_gamma_inc( double x, long y ) { return gsl_sf_gamma_inc( ( const double) x, ( const double) y );} double gsl_sf_lnbeta( double x, long y ) { return gsl_sf_lnbeta( ( const double) x, ( const double) y );} double gsl_sf_beta( double x, long y ) { return gsl_sf_beta( ( const double) x, ( const double) y );} double gsl_sf_gegenpoly_1( double x, long y ) { return gsl_sf_gegenpoly_1( ( double) x, ( double) y );} double gsl_sf_gegenpoly_2( double x, long y ) { return gsl_sf_gegenpoly_2( ( double) x, ( double) y );} double gsl_sf_gegenpoly_3( double x, long y ) { return gsl_sf_gegenpoly_3( ( double) x, ( double) y );} double gsl_sf_hyperg_0F1( double x, long y ) { return gsl_sf_hyperg_0F1( ( const double) x, ( const double) y );} double gsl_sf_laguerre_1( double x, long y ) { return gsl_sf_laguerre_1( ( double) x, ( double) y );} double gsl_sf_laguerre_2( double x, long y ) { return gsl_sf_laguerre_2( ( double) x, ( double) y );} double gsl_sf_laguerre_3( double x, long y ) { return gsl_sf_laguerre_3( ( double) x, ( double) y );} double gsl_sf_legendre_Pl( long x, double y ) { return gsl_sf_legendre_Pl( ( const int) x, ( const double) y );} double gsl_sf_legendre_Ql( long x, double y ) { return gsl_sf_legendre_Ql( ( const int) x, ( const double) y );} double gsl_sf_conicalP_half( double x, long y ) { return gsl_sf_conicalP_half( ( const double) x, ( const double) y );} double gsl_sf_conicalP_mhalf( double x, long y ) { return gsl_sf_conicalP_mhalf( ( const double) x, ( const double) y );} double gsl_sf_conicalP_0( double x, long y ) { return gsl_sf_conicalP_0( ( const double) x, ( const double) y );} double gsl_sf_conicalP_1( double x, long y ) { return gsl_sf_conicalP_1( ( const double) x, ( const double) y );} double gsl_sf_legendre_H3d_0( double x, long y ) { return gsl_sf_legendre_H3d_0( ( const double) x, ( const double) y );} double gsl_sf_legendre_H3d_1( double x, long y ) { return gsl_sf_legendre_H3d_1( ( const double) x, ( const double) y );} double gsl_sf_pow_int( double x, long y ) { return gsl_sf_pow_int( ( const double) x, ( const int) y );} double gsl_sf_psi_int( long x ) { return gsl_sf_psi_int( ( const int) x );} double gsl_sf_psi_1_int( long x ) { return gsl_sf_psi_1_int( ( const int) x );} double gsl_sf_psi_n( long x, double y ) { return gsl_sf_psi_n( ( const int) x, ( const double) y );} double gsl_sf_hypot( double x, long y ) { return gsl_sf_hypot( ( const double) x, ( const double) y );} double gsl_sf_zeta_int( long x ) { return gsl_sf_zeta_int( ( const int) x );} double gsl_sf_zetam1_int( long x ) { return gsl_sf_zetam1_int( ( const int) x );} double gsl_sf_hzeta( double x, long y ) { return gsl_sf_hzeta( ( const double) x, ( const double) y );} double gsl_sf_eta_int( long x ) { return gsl_sf_eta_int( ( const int) x );} /*****************/ /*****************/ void init_gsl_sf() { 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("gslsfellintDcomp","(",new OneOperator2( gsl_sf_ellint_Dcomp )); 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("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("gslsfhyperg0F1","(",new OneOperator2( gsl_sf_hyperg_0F1 )); 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("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("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("gslsflegendreH3d0","(",new OneOperator2( gsl_sf_legendre_H3d_0 )); Global.Add("gslsflegendreH3d1","(",new OneOperator2( gsl_sf_legendre_H3d_1 )); 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.26-2/examples++-load/fflapack.cpp000644 000767 000767 00000106425 12167254041 017742 0ustar00hecht000000 000000 //ff-c++-LIBRARY-dep: lapack //ff-c++-LIBRARY-dep: 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 class Init { public: Init(); }; bool 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; } // (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 << 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])); } }; /* class Init { public: Init(); }; */ 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); 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; } 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); a->resize(n,n); *a=0.; for(int i=0;i* > > (); Dcl_Type< Inverse* > > (); TheOperators->Add("^", new OneBinaryOperatorRNM_inv()); TheOperators->Add("^", new OneBinaryOperatorRNM_inv()); TheOperators->Add("=", new OneOperator2*,KNM*,Inverse*> >( Solve) ); TheOperators->Add("=", new OneOperator2*,KNM*,Inverse*> >( SolveC) ); } */ LOADINIT(Init); // une variable globale qui serat construite au chargement dynamique template R Build2(A a,B b) { return R(a,b); } Init::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) ); TheOperators->Add("=", new OneOperator2*,KNM*,Inverse*> >( SolveC) ); 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("dgeev","(",new OneOperator3_*,KN*,KNM*>(lapack_dgeev)); Global.Add("zgeev","(",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 ) "; } freefem++-3.26-2/examples++-load/ffnewuoa.cpp000644 000767 000767 00000012666 11654763720 020021 0ustar00hecht000000 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(); }; LOADINIT(Init); // une variable globale qui serat construite au chargement dynamique Init::Init() // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ { Global.Add("newuoa","(",new OptimNewoa(1)); // j + dJ } freefem++-3.26-2/examples++-load/ffnewuoa.edp000644 000767 000767 00000007274 11406142255 017773 0ustar00hecht000000 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.26-2/examples++-load/ffrandom.edp000644 000767 000767 00000000307 11406142255 017743 0ustar00hecht000000 000000 load "ffrandom" srandomdev(); cout << random() << endl; cout << random() << endl; cout << random() << endl; srandom(10); cout << random() << endl; cout << random() << endl; cout << random() << endl; freefem++-3.26-2/examples++-load/fig.pgm000644 000767 000767 00000224133 11406142255 016734 0ustar00hecht000000 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.26-2/examples++-load/FreeFemQA.cpp000644 000767 000767 00000014530 11714511455 017723 0ustar00hecht000000 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(); }; LOADINIT(Init); // une variable globale qui serat construite au chargement dynamique // Init init; Init::Init() { cout << "\n -- lood: init MeshGenQA\n"; Global.Add("MeshGenQA","(", new OneOperatorCode( )); } freefem++-3.26-2/examples++-load/freeyams.cpp000644 000767 000767 00000054003 12167254041 020000 0ustar00hecht000000 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(); }; LOADINIT(Init1) // une variable globale qui serat construite au chargement dynamique Init1::Init1(){ // 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" freefem++-3.26-2/examples++-load/funcTemplate.cpp000644 000767 000767 00000012315 11654764356 020633 0ustar00hecht000000 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)); } freefem++-3.26-2/examples++-load/funcTemplate.edp000644 000767 000767 00000002606 11435701373 020606 0ustar00hecht000000 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.26-2/examples++-load/glumesh3D.edp000755 000767 000767 00000002311 12130607024 017775 0ustar00hecht000000 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. // #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) 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); cout << "Mesh Format is " << format << endl; if(format){ binary = true; cout << "Mesh is in binary format" << endl; int one; if(fread(&one, sizeof(int), 1, fp) != 1) exit(1); if(one != 1){ swap = true; cout << "Swapping bytes from binary file" << endl; } } } else if(!strncmp(&str[1], "PhysicalNames", 13)) { 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) 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] ]; 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] ]; cout << "Triangles " << it+1 << " " << iv0+1 << " " << iv1+1 << " " << iv2+1 << endl; (ttff++)->set(vff, iv0, iv1, iv2, physical); cout << "mes=" << tff[it].area << endl; if( tff[it].area < 1e-8 ){ cout << "bug" << 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)) { cout << " NodeData is not considered in freefem++ " << endl; } else if(!strncmp(&str[1], "ElementData", 11) || !strncmp(&str[1], "ElementNodeData", 15)){ 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) 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; cout << "Mesh is in binary format" << endl; int one; if(fread(&one, sizeof(int), 1, fp) != 1) exit(1); if(one != 1){ swap = true; cout << "Swapping bytes from binary file" << endl; } } } else if(!strncmp(&str[1], "PhysicalNames", 13)) { 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) 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); 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)) { cout << " NodeData is not considered in freefem++ " << endl; } else if(!strncmp(&str[1], "ElementData", 11) || !strncmp(&str[1], "ElementNodeData", 15)){ 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(); }; LOADINIT(Init1) // une variable globale qui serat construite au chargement dynamique Init1::Init1(){ // le constructeur qui ajoute la fonction "splitmesh3" a freefem++ //if (verbosity) if(verbosity) cout << " load: gmsh " << endl; Global.Add("gmshload3","(",new GMSH_LoadMesh3); Global.Add("gmshload","(",new GMSH_LoadMesh); if(verbosity) cout << " load: gmsh " << endl; } freefem++-3.26-2/examples++-load/gsl.awk000644 000767 000767 00000005754 11513610462 016760 0ustar00hecht000000 000000 # egrep "^int|^double" /opt/local/include/gsl/gsl_sf* BEGIN {FS="[(),]"; LANG="C"; edp="gsl1.edp"; c="\""; pp=c "(" c; print " /* "; print "load",c "gsl" c > edp } function f0(f) { xx=f;gsub("_","",xx) ; return xx }; function ff(f) { return c f0(f) c }; NF ==3 { split($1,fff,"[ \t]*"); f=fff[2]; split($2,fff,"[ \t]*"); tt=0; i2=1 ok=1 nn=0; v0=1; t=""; while(ok==1 && nn++<5) { # print " ---- " , fff[i2] , i2 if(fff[i2] == "unsigned" ) { t= t " " fff[i2] ;} else if(fff[i2] == "int" ) { t= t " " fff[i2] ;tt="long";} else if(fff[i2] == "double" ) { t= t " " fff[i2];tt="double"; v0=0.55 ;} else if(fff[i2] == "const" ) { t= t " " fff[i2] ;} else {i2--;ok=0;} i2++; } p1=fff[i2]; #print f, " " , t , " " , tt, " " , p1; lw=""; if(tt!=0){ if(tt=="long") { lw ="double " f "( long x ) { return " f "( (" t ") x );}\n" ; } gg = "\n Global.Add("ff(f) "," pp",new OneOperator1( " f " )); " cw = cw lw; cm = cm gg; print "cout << " c f "("v0") = " c " << " f0(f) "("v0") << endl; "> edp } else print " missng "f,t,tt } NF > 4 { print " minssing " $0 ; } NF ==4 { split($1,fff,"[ \t]*"); f=fff[2]; split($2,fff,"[ \t]*"); tt=0; i2=1 ok=1 nn=0; t=""; while(ok==1 && nn++<5) { # print " ---- " , fff[i2] , i2 if(fff[i2] == "unsigned" ) { t= t " " fff[i2] ;} else if(fff[i2] == "int" ) { t= t " " fff[i2] ;tt="long";} else if(fff[i2] == "double" ) { t= t " " fff[i2];tt="double" ;} else if(fff[i2] == "const" ) { t= t " " fff[i2] ;} else {i2--;ok=0;} i2++; } p1=fff[i2]; tt1=tt; t1=t; split($3,fff,"[ \t]*"); tt=0; i2=1 ok=1 nn=0; t=""; if (fff[i2]==" ") i2++; if (fff[i2]=="") i2++; if (fff[i2]==" ") i2++; while(ok==1 && nn++<5) { # print " ---- " , fff[i2] , i2 if(fff[i2] == "unsigned" ) { t= t " " fff[i2] ;} else if(fff[i2] == "int" ) { t= t " " fff[i2] ;tt="long";} else if(fff[i2] == "gsl_mode_t" ) { t= t " " fff[i2] ;tt="long";} else if(fff[i2] == "double" ) { t= t " " fff[i2];tt="double" ;} else if(fff[i2] == "const" ) { t= t " " fff[i2] ;} else {i2--;ok=0;} i2++; } p2=fff[i2]; # print f, " " , t , " " , tt, " " , p1, p3; lw=""; if(tt && tt1 ) { if(tt1=="long" || tt="long") { lw ="double " f "( " tt1 " x, " tt " y ) { return " f "( (" t1 ") x, (" t ") y );}\n" ; } gg = "\n Global.Add(" ff(f) "," pp ",new OneOperator2( " f " )); "; cw = cw lw; cm = cm gg; } else print NF, " ", tt1,",",tt," --" t1," ",t " ::: " " missing -- ", f , " (" , $2 "," $3 ") " fff[1] "," fff[2],",", fff[3] } END { print " */ " print "/*****************/"; print "/*****************/"; print cw ; print "/*****************/"; print "/*****************/"; print " void init_gsl_sf() { \n" print cm ; print " } "; print "/*****************/"; print "/*****************/"; }freefem++-3.26-2/examples++-load/._gsl.cpp000644 000767 000024 00000000253 12154316561 020175 0ustar00hechtstaff000000 000000 Mac OS X  2yATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/examples++-load/gsl.cpp000644 000767 000767 00000005364 12154316561 016762 0ustar00hecht000000 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 "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; } class Init { public: Init(); }; LOADINIT(Init); Init::Init(){ init_gsl_sf() ; Global.Add("gslpolysolvequadratic","(",new OneOperator2,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), */ } freefem++-3.26-2/examples++-load/gsl.edp000644 000767 000767 00000020246 12167254041 016742 0ustar00hecht000000 000000 load "gsl" cout << "gsl_sf_airy_zero_Ai(1) = " << gslsfairyzeroAi(1) << endl; cout << "gsl_sf_airy_zero_Bi(1) = " << gslsfairyzeroBi(1) << endl; cout << "gsl_sf_airy_zero_Ai_deriv(1) = " << gslsfairyzeroAideriv(1) << endl; cout << "gsl_sf_airy_zero_Bi_deriv(1) = " << gslsfairyzeroBideriv(1) << 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_Y0(0.55) = " << gslsfbesselY0(0.55) << endl; cout << "gsl_sf_bessel_Y1(0.55) = " << gslsfbesselY1(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_I0_scaled(0.55) = " << gslsfbesselI0scaled(0.55) << endl; cout << "gsl_sf_bessel_I1_scaled(0.55) = " << gslsfbesselI1scaled(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_K0_scaled(0.55) = " << gslsfbesselK0scaled(0.55) << endl; cout << "gsl_sf_bessel_K1_scaled(0.55) = " << gslsfbesselK1scaled(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_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_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_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_zero_J0(1) = " << gslsfbesselzeroJ0(1) << endl; cout << "gsl_sf_bessel_zero_J1(1) = " << gslsfbesselzeroJ1(1) << endl; cout << "gsl_sf_clausen(0.55) = " << gslsfclausen(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_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_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_expint_E1(0.55) = " << gslsfexpintE1(0.55) << endl; cout << "gsl_sf_expint_E2(0.55) = " << gslsfexpintE2(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_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_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_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_fact(1) = " << gslsffact(1) << endl; cout << "gsl_sf_doublefact(1) = " << gslsfdoublefact(1) << endl; cout << "gsl_sf_lnfact(1) = " << gslsflnfact(1) << endl; cout << "gsl_sf_lndoublefact(1) = " << gslsflndoublefact(1) << 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_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_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_psi_int(1) = " << gslsfpsiint(1) << 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(1) = " << gslsfpsi1int(1) << endl; cout << "gsl_sf_psi_1(0.55) = " << gslsfpsi1(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_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(2) = " << gslsfzetaint(2) << 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(2) = " << gslsfzetam1int(2) << endl; cout << "gsl_sf_eta_int(1) = " << gslsfetaint(1) << endl; cout << "gsl_sf_eta(0.55) = " << gslsfeta(0.55) << endl; // 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] < #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); } class IluInit { public: IluInit() { 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)); } }; //static IluInit init; LOADINIT(IluInit) freefem++-3.26-2/examples++-load/ilut.edp000644 000767 000767 00000001711 11643537361 017135 0ustar00hecht000000 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;kO2 ']لQ|ƿm φbS_)6b*6޿?7ӫ[<>UM_ Ql^Q~R?IF71Oƿ^eYèvG^WKz,O '.,&v&,-EFkX!}][Va3?AJk!W,OwE& _-dA13q{m(B¿6ddHH0_!R RtD)nb$S;Y/^3Gy?FϘeY=̿r; sk[,>+AQ?%CF?AJkU^n+JWhr _w_}焿(Aġ7?vhןY23)oE֊'Y?AJk?*uP.f cYn R_m9Ķ"$+fd,=]!ӭsS_7],sIf[d Clg?$?LOOVVjN0Ȳ$#Sr.*m}? %uϧ,yƭ R.тfo?Dgg,Ngfu G'H u %g1XKSOj~pyfDŽw;&MnH6O`?FBuildBound(); // 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; 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 cout << "this type of cell is not taking account in Freefem++ " << 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++"<< 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 cout << "this type of cell is not taking account in Freefem++ " << 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 << "extension file is not correct " << endl; exit(1); } // 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; // 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"); } 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++){ 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; 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"); } 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"); } 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]; 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"); } 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"); } 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 cout << "this type of cell 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 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); } freefem++-3.26-2/examples++-load/IpoptLap.edp000644 000767 000767 00000005564 11730400403 017701 0ustar00hecht000000 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.26-2/examples++-load/IpoptMinSurfVol.edp000644 000767 000767 00000015057 12211656553 021245 0ustar00hecht000000 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;kkk^doc pour ipopt_Amessage:%3C9095C9A2-E082-4410-AA8C-FCFCB6BAF47E@ann.jussieu.fr%3E 5Dfreefem++-3.26-2/examples++-load/IpoptVI2.edp000644 000767 000767 00000002760 11737335344 017602 0ustar00hecht000000 000000 load "ff-Ipopt"; int nn=10; mesh Th=square(nn,nn); fespace Vh(Th,[P1,P1] ); fespace Wh(Th,[P1] ); int iter=0; func f1 = 10;//right hand sides func f2 = -15; func g1 = -0.1;//Boundary conditions functions func g2 = 0.1; Vh [uz,uz2]=[1,1],[lz,lz2]=[1,1]; Wh lm=1.; Vh [u1,u2]=[0,0];//starting point while(++iter) { macro Grad(u) [dx(u),dy(u)]//gradient macro varf vP([u1,u2],[v1,v2]) = int2d(Th)(Grad(u1)'*Grad(v1)+ Grad(u2)'*Grad(v2)) - int2d(Th)(f1*v1+f2*v2); matrix A = vP(Vh,Vh);//Fitness function matrix... real[int] b = vP(0,Vh);//and linear form int[int] II1=[0],II2=[1];//Constraints matrix matrix C1 = interpolate (Wh,Vh, U2Vc=II1); matrix C2 = interpolate (Wh,Vh, U2Vc=II2); matrix CC = -1*C1 + C2; // u2 - u1 >0 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.26-2/examples++-load/IPOTest.edp000644 000767 000767 00000004330 11730400232 017426 0ustar00hecht000000 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.26-2/examples++-load/._isoline.cpp000644 000767 000024 00000000253 12134244151 021043 0ustar00hechtstaff000000 000000 Mac OS X  2yATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/examples++-load/isoline.cpp000644 000767 000767 00000057333 12134244151 017633 0ustar00hecht000000 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.26-2/examples++-load/._isoline.edp000644 000767 000024 00000000253 11741351162 021035 0ustar00hechtstaff000000 000000 Mac OS X  2yFRAdSMULATTRcom.apple.TextEncodingutf-8;134217984freefem++-3.26-2/examples++-load/isoline.edp000644 000767 000767 00000003231 11741351162 017611 0ustar00hecht000000 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(); }; LOADINIT(Init); // une variable globale qui serat construite au chargement dynamique Init::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); } freefem++-3.26-2/examples++-load/lame-TD-NSS.edp000644 000767 000767 00000004105 11625711166 020041 0ustar00hecht000000 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.26-2/examples++-load/lap-solvers.edp000644 000767 000767 00000002171 12167254041 020421 0ustar00hecht000000 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.26-2/examples++-load/lapack.cpp000644 000767 000767 00000106424 12167254041 017425 0ustar00hecht000000 000000 //ff-c++-LIBRARY-dep: lapack //ff-c++-LIBRARY-dep: 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 class Init { public: Init(); }; 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; } // (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 << 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])); } }; /* class Init { public: Init(); }; */ 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); 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; } 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); a->resize(n,n); *a=0.; for(int i=0;i* > > (); Dcl_Type< Inverse* > > (); TheOperators->Add("^", new OneBinaryOperatorRNM_inv()); TheOperators->Add("^", new OneBinaryOperatorRNM_inv()); TheOperators->Add("=", new OneOperator2*,KNM*,Inverse*> >( Solve) ); TheOperators->Add("=", new OneOperator2*,KNM*,Inverse*> >( SolveC) ); } */ LOADINIT(Init); // une variable globale qui serat construite au chargement dynamique template R Build2(A a,B b) { return R(a,b); } Init::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) ); TheOperators->Add("=", new OneOperator2*,KNM*,Inverse*> >( SolveC) ); 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("dgeev","(",new OneOperator3_*,KN*,KNM*>(lapack_dgeev)); Global.Add("zgeev","(",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 ) "; } freefem++-3.26-2/examples++-load/lapack.edp000644 000767 000767 00000006221 12167254041 017405 0ustar00hecht000000 000000 load "fflapack" // load "fflapack" obsolete (F. Hecht version 3.8) { int n=5; real[int,int] A(n,n),A1(n,n),B(n,n); for(int i=0;i 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.26-2/examples++-load/LapDG4.edp000644 000767 000767 00000003542 11406142255 017166 0ustar00hecht000000 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.26-2/examples++-load/LaplaceP3.edp000644 000767 000767 00000001217 11406142255 017714 0ustar00hecht000000 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.26-2/examples++-load/LaplaceP4.edp000644 000767 000767 00000002666 11754421664 017740 0ustar00hecht000000 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.26-2/examples++-load/LaplaceRT1.edp000644 000767 000767 00000002350 11567136027 020047 0ustar00hecht000000 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.26-2/examples++-load/LapLNewSolver.edp000644 000767 000767 00000001316 11450301200 020627 0ustar00hecht000000 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.26-2/examples++-load/LapMUMPS_seq.edp000644 000767 000767 00000001360 12055501737 020362 0ustar00hecht000000 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.26-2/examples++-load/LapNewSolver.edp000644 000767 000767 00000001254 11406142255 020532 0ustar00hecht000000 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.26-2/examples++-load/LapUmfpack64.edp000644 000767 000767 00000001320 11406142255 020340 0ustar00hecht000000 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.26-2/examples++-load/layer.edp000644 000767 000767 00000000131 11406142255 017256 0ustar00hecht000000 000000 load "msh3" mesh Th=square(3,3); mesh3 Th3=buildlayers(Th,3); savemesh(Th3,"lll.mesh"); freefem++-3.26-2/examples++-load/Leman-mesh.edp000644 000767 000767 00000002474 12034157746 020155 0ustar00hecht000000 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.26-2/examples++-load/lgbmo.cpp000644 000767 000767 00000021462 11654763720 017301 0ustar00hecht000000 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(); }; LOADINIT(Init); // une variable globale qui serat construite au chargement dynamique Init::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 } freefem++-3.26-2/examples++-load/load.edp000644 000767 000767 00000000526 11656306311 017073 0ustar00hecht000000 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.26-2/examples++-load/load.link.in000755 000767 000767 00000021201 12221062076 017655 0ustar00hecht000000 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@' 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="-Iinclude" 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]*=//'` ;; -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 " ERROR in auto dependance seach. 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" 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' '$b/FreeFem++-api.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 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 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 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 fi fi freefem++-3.26-2/examples++-load/Makefile.am000644 000767 000767 00000026700 12243216756 017526 0ustar00hecht000000 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 # 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-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 isolineP1.cpp isoline.cpp lg.pgm \ thresholdings.cpp \ VTK_writer_3d.cpp VTK_writer.cpp splitedges.cpp \ Element_Mixte.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 \ ff-Ipopt.cpp \ scotch.cpp shell.cpp \ pipe.cpp pstream.h \ symmetrizeCSR.cpp \ dmatrix.hpp PARDISO.cpp \ ch.pts 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) \ myfunction2.$(DYLIB_SUFFIX) \ MetricPk.$(DYLIB_SUFFIX) FreeFemQA.$(DYLIB_SUFFIX) shell.$(DYLIB_SUFFIX) \ @TOOL_DYLIB_pipe@ symmetrizeCSR.$(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_metis@ \ @TOOL_DYLIB_umfpack@ NewSolver.$(DYLIB_SUFFIX) @TOOL_DYLIB_lapack@ @TOOL_DYLIB_fflapack@ \ ffnewuoa.$(DYLIB_SUFFIX) ilut.$(DYLIB_SUFFIX) @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_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 $(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. if ENABLE_FFCS 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 include.done: $(allheaders) mkdir -p include cp $^ include touch $@ else include.done: include.tar.gz rm -rf include gunzip -c include.tar.gz| tar xvf - -rm -f include/._* 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 $(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 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 # 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.26-2/examples++-load/Makefile.in000644 000767 000767 00000202155 12245613203 017525 0ustar00hecht000000 000000 # Makefile.in generated by automake 1.13.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2012 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__make_dryrun = \ { \ am__dry=no; \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ echo 'am--echo: ; @echo "AM" OK' | $(MAKE) -f - 2>/dev/null \ | grep '^AM OK$$' >/dev/null || am__dry=yes;; \ *) \ for am__flg in $$MAKEFLAGS; do \ case $$am__flg in \ *=*|--*) ;; \ *n*) am__dry=yes; break;; \ esac; \ done;; \ esac; \ test $$am__dry = yes; \ } 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 DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \ $(top_srcdir)/mkinstalldirs $(top_srcdir)/test-driver README ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/acmacros.m4 \ $(top_srcdir)/acoptim.m4 $(top_srcdir)/acmpi.m4 \ $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) 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) 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@ 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@ FFMETIS_CFLAGS = @FFMETIS_CFLAGS@ FF_LAPACKdir = @FF_LAPACKdir@ FF_MALLOC_H = @FF_MALLOC_H@ FF_SECOND = @FF_SECOND@ FF_STATIC_LIB = @FF_STATIC_LIB@ FF_UMFPACK_CONFIG = @FF_UMFPACK_CONFIG@ FLIBS = @FLIBS@ FNOFLAGS = @FNOFLAGS@ G2CLIB = @G2CLIB@ GCCNOCYGWIN = @GCCNOCYGWIN@ GREP = @GREP@ 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@ 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@ TOOL_COMPILE_fflapack = @TOOL_COMPILE_fflapack@ TOOL_COMPILE_gsl = @TOOL_COMPILE_gsl@ TOOL_COMPILE_hips = @TOOL_COMPILE_hips@ TOOL_COMPILE_ipopt = @TOOL_COMPILE_ipopt@ TOOL_COMPILE_lapack = @TOOL_COMPILE_lapack@ TOOL_COMPILE_metis = @TOOL_COMPILE_metis@ 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_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_fflapack = @TOOL_DYLIB_fflapack@ TOOL_DYLIB_gsl = @TOOL_DYLIB_gsl@ TOOL_DYLIB_hips = @TOOL_DYLIB_hips@ TOOL_DYLIB_ipopt = @TOOL_DYLIB_ipopt@ TOOL_DYLIB_lapack = @TOOL_DYLIB_lapack@ TOOL_DYLIB_metis = @TOOL_DYLIB_metis@ 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_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@ 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_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 # 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-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 isolineP1.cpp isoline.cpp lg.pgm \ thresholdings.cpp \ VTK_writer_3d.cpp VTK_writer.cpp splitedges.cpp \ Element_Mixte.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 \ ff-Ipopt.cpp \ scotch.cpp shell.cpp \ pipe.cpp pstream.h \ symmetrizeCSR.cpp \ dmatrix.hpp PARDISO.cpp \ ch.pts 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) \ myfunction2.$(DYLIB_SUFFIX) \ MetricPk.$(DYLIB_SUFFIX) FreeFemQA.$(DYLIB_SUFFIX) shell.$(DYLIB_SUFFIX) \ @TOOL_DYLIB_pipe@ symmetrizeCSR.$(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_metis@ \ @TOOL_DYLIB_umfpack@ NewSolver.$(DYLIB_SUFFIX) @TOOL_DYLIB_lapack@ @TOOL_DYLIB_fflapack@ \ ffnewuoa.$(DYLIB_SUFFIX) ilut.$(DYLIB_SUFFIX) @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_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. @ENABLE_FFCS_TRUE@allheaders = ../src/fflib/AddNewFE.h ../src/fflib/AFunction_ext.hpp ../src/fflib/AFunction.hpp ../src/fflib/AnyType.hpp \ @ENABLE_FFCS_TRUE@ ../src/fflib/array_init.hpp ../src/fflib/array_resize.hpp ../src/fflib/array_tlp.hpp \ @ENABLE_FFCS_TRUE@ ../src/femlib/assertion.hpp ../src/femlib/BamgFreeFem.hpp ../src/Algo/BFGS.hpp ../src/Algo/BrentLS.hpp \ @ENABLE_FFCS_TRUE@ ../src/Algo/CG.hpp ../src/femlib/CGNL.hpp ../src/fflib/CodeAlloc.hpp ../config.h ../config-wrapper.h \ @ENABLE_FFCS_TRUE@ ../src/Algo/CubicLS.hpp ../src/Algo/defs.hpp ../src/femlib/DOperator.hpp ../src/libMesh/eigenv.h \ @ENABLE_FFCS_TRUE@ ../src/fflib/endian.hpp ../src/fflib/environment.hpp ../src/fflib/error.hpp ../src/femlib/fem3.hpp \ @ENABLE_FFCS_TRUE@ ../src/femlib/fem.hpp ../src/femlib/FESpace.hpp ../src/femlib/FESpacen.hpp ../src/fflib/ff++.hpp \ @ENABLE_FFCS_TRUE@ ../src/fflib/ffstack.hpp ../src/femlib/FQuadTree.hpp ../src/femlib/GenericMesh.hpp \ @ENABLE_FFCS_TRUE@ ../src/Graphics/getprog-unix.hpp ../src/Graphics/glrgraph.hpp ../src/femlib/gmres.hpp \ @ENABLE_FFCS_TRUE@ ../src/femlib/GQuadTree.hpp ../src/femlib/HashTable.hpp ../src/femlib/HeapSort.hpp ../src/fflib/InitFunct.hpp \ @ENABLE_FFCS_TRUE@ ../src/fflib/ffapi.hpp ../src/femlib/Label.hpp ../src/fflib/lex.hpp ../src/fflib/lgfem.hpp \ @ENABLE_FFCS_TRUE@ ../src/fflib/lgmesh3.hpp ../src/fflib/lgsolver.hpp ../src/lglib/lg.tab.hpp ../src/femlib/libmesh5.h \ @ENABLE_FFCS_TRUE@ ../src/Algo/LineSearch.hpp ../src/femlib/MatriceCreuse.hpp ../src/femlib/MatriceCreuse_tpl.hpp \ @ENABLE_FFCS_TRUE@ ../src/femlib/Mesh1dn.hpp ../src/femlib/Mesh2dn.hpp ../src/bamglib/Mesh2.h ../src/femlib/Mesh3dn.hpp \ @ENABLE_FFCS_TRUE@ ../src/bamglib/Meshio.h ../src/femlib/MeshPoint.hpp ../src/bamglib/meshtype.h ../src/bamglib/Metric.h \ @ENABLE_FFCS_TRUE@ ../src/Graphics/mode_open.hpp ../src/Algo/NewtonRaphson.hpp ../src/Algo/NRJ.hpp ../src/fflib/Operator.hpp \ @ENABLE_FFCS_TRUE@ ../src/Algo/Optima.hpp ../src/Algo/Param.hpp ../src/femlib/PkLagrange.hpp ../src/fflib/PlotStream.hpp \ @ENABLE_FFCS_TRUE@ ../src/fflib/problem.hpp ../src/femlib/QuadratureFormular.hpp ../src/bamglib/QuadTree.h ../src/femlib/R1.hpp \ @ENABLE_FFCS_TRUE@ ../src/bamglib/R2.h ../src/femlib/R2.hpp ../src/femlib/R3.hpp ../src/femlib/RefCounter.hpp \ @ENABLE_FFCS_TRUE@ ../src/Graphics/rgraph.hpp ../src/femlib/RNM.hpp ../src/femlib/RNM_opc.hpp ../src/femlib/RNM_op.hpp \ @ENABLE_FFCS_TRUE@ ../src/femlib/RNM_tpl.hpp ../src/Algo/RosenBrock.hpp ../src/fflib/Serialize.hpp ../src/bamglib/SetOfE4.h \ @ENABLE_FFCS_TRUE@ ../src/fflib/showverb.hpp ../src/femlib/splitsimplex.hpp ../src/fflib/String.hpp \ @ENABLE_FFCS_TRUE@ ../src/fflib/strversionnumber.hpp ../src/fflib/throwassert.hpp ../src/femlib/ufunction.hpp \ @ENABLE_FFCS_TRUE@ ../src/fflib/versionnumber.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 .PRECIOUS: 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 # exand 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; \ else \ 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) .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 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 $(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@ mkdir -p include @ENABLE_FFCS_TRUE@ cp $^ include @ENABLE_FFCS_TRUE@ touch $@ @ENABLE_FFCS_FALSE@include.done: include.tar.gz @ENABLE_FFCS_FALSE@ rm -rf include @ENABLE_FFCS_FALSE@ gunzip -c include.tar.gz| tar xvf - @ENABLE_FFCS_FALSE@ -rm -f include/._* @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 $(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 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 # 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.26-2/examples++-load/makeref.edp000644 000767 000767 00000006151 12240777664 017603 0ustar00hecht000000 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(); }; LOADINIT(Init); Init::Init() { cout << " lood: init Mat Chacon " << endl; Global.Add("MatUpWind1","(", new OneOperatorCode( )); } freefem++-3.26-2/examples++-load/mat_psi.cpp000644 000767 000767 00000016551 12167254041 017627 0ustar00hecht000000 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; Init::Init() { cout << " lood: init Mat Chacon " << endl; Global.Add("MatUpWind0","(", new OneOperatorCode( )); Global.Add("MatUpWind0","(", new OneOperatorCode( )); } freefem++-3.26-2/examples++-load/medit.cpp000644 000767 000767 00000204076 12167254041 017276 0ustar00hecht000000 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 >); } freefem++-3.26-2/examples++-load/meditddm.edp000644 000767 000767 00000003472 11406142255 017744 0ustar00hecht000000 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.26-2/examples++-load/metis.cpp000644 000767 000767 00000010734 11744025140 017305 0ustar00hecht000000 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 LOADINIT(Init); Init::Init(){ if(verbosity && mpirank == 0) cout << " lood: init metis " << endl; 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)); } freefem++-3.26-2/examples++-load/metis.edp000644 000767 000767 00000000502 11406142255 017265 0ustar00hecht000000 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(); }; LOADINIT(Init); Init::Init() { cout << "\n -- lood: init MetricKuate\n"; Global.Add("MetricKuate","(", new OneOperatorCode( )); } freefem++-3.26-2/examples++-load/MetricKuate.edp000644 000767 000767 00000006734 12167254041 020400 0ustar00hecht000000 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.26-2/examples++-load/MetricPk.cpp000644 000767 000767 00000045505 11714263752 017720 0ustar00hecht000000 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; Init::Init() { cout << "\n -- lood: init MetricPk\n"; Global.Add("MetricPk","(", new OneOperatorCode( )); } freefem++-3.26-2/examples++-load/mmg3d-v4.0.cpp000644 000767 000767 00000025473 12076263276 017703 0ustar00hecht000000 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(); }; LOADINIT(Init1) // une variable globale qui serat construite au chargement dynamique Init1::Init1(){ // 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" freefem++-3.26-2/examples++-load/Morley.cpp000644 000767 000767 00000017643 11406142255 017443 0ustar00hecht000000 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 // 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]); } } 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) ); //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));} if(yy){ tyy[i]=GetAny((*yy)(stack));} if(zz){ tzz[i]=GetAny((*zz)(stack));} 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); if( nrtet.N() >0){ for (int i=0;ielements[i] ); int iv[4]; iv[0]= T_Th3->operator()(K[0]); iv[1]= T_Th3->operator()(K[1]); iv[2]= T_Th3->operator()(K[2]); iv[3]= T_Th3->operator()(K[3]); // les 3 triangles par triangles origines int lab=K.lab; T_Th3->elements[i].set( T_Th3->vertices, iv, ChangeLab3D(maptet,lab)); } } // les arete frontieres qui n'ont pas change if( nrf.N()>0){ for (int i=0;ibe(i) ); int iv[3]; iv[0] = T_Th3->operator()(K[0]); iv[1] = T_Th3->operator()(K[1]); iv[2] = T_Th3->operator()(K[2]); int l0,l1=ChangeLab3D(mapface,l0=K.lab) ; T_Th3->be(i).set( T_Th3->vertices, iv, l1 ); } } if(nbt != 0) { long orientationelement( arg(6,stack,1L) ); if( orientationelement == -1){ // change all orientation of borderelements and elements for (int i=0;int;i++) { const Tet &K( T_Th3->elements[i] ); int iv[4]; iv[0] = T_Th3->operator()(K[0]); iv[1] = T_Th3->operator()(K[1]); iv[2] = T_Th3->operator()(K[2]); iv[3] = T_Th3->operator()(K[3]); int iv_temp=iv[1]; iv[1]=iv[2]; iv[2]=iv_temp; T_Th3->elements[i].set( T_Th3->vertices, iv, K.lab ); } for (int i=0;inbe;i++) { const Triangle3 &K( T_Th3->be(i) ); int iv[3]; iv[0] = T_Th3->operator()(K[0]); iv[1] = T_Th3->operator()(K[1]); iv[2] = T_Th3->operator()(K[2]); int iv_temp=iv[1]; iv[1]=iv[2]; iv[2]=iv_temp; T_Th3->be(i).set( T_Th3->vertices, iv, K.lab ); } } if(flagsurfaceall==1) T_Th3->BuildBoundaryElementAdj(); T_Th3->BuildGTree(); } else { // parameter orientation for a 3D surface mesh long orientationsurf( arg(6,stack,1L) ); if( orientationsurf == -1){ // change all orientation of borderelements for (int i=0;inbe;i++) { const Triangle3 &K( T_Th3->be(i) ); int iv[3]; iv[0] = T_Th3->operator()(K[0]); iv[1] = T_Th3->operator()(K[1]); iv[2] = T_Th3->operator()(K[2]); int iv_temp=iv[1]; iv[1]=iv[2]; iv[2]=iv_temp; T_Th3->be(i).set( T_Th3->vertices, iv, K.lab ); } } if(flagsurfaceall==1) T_Th3->BuildBoundaryElementAdj(); } Add2StackOfPtr2FreeRC(stack,T_Th3); *mp=mps; return T_Th3; } class Movemesh3D : public OneOperator { public: Movemesh3D() : OneOperator(atype(),atype()) {} E_F0 * code(const basicAC_F0 & args) const { return new Movemesh3D_Op(args,t[0]->CastTo(args[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){ // 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; 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; } //cout << "i_som, nv_t=" <= 0 && iv[jj] < nv_t); //cout <<"i_elem=" << i_elem << "i=" << ii <<" " << jj << " " << Th3.operator()(K[jj]) << " " << iv[jj] << endl; } //T_Th3->elements[i_elem].set(T_Th3->vertices, iv, lab); (tt++)->set(v, iv, lab); i_elem=i_elem+1; } 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 = 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_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 > 1) cout << " BuilBound " < 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; 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_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 >1) 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 >1) cout << "longmini_box" << longmini_box << endl; if(verbosity >1) cout << "hmin =" << hmin << endl; assert( hmin < longmini_box); if(verbosity >1) 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; ii1) cout << "numberofpoints " << numberofpoints << endl; if(verbosity >1) cout << "taille boite englobante =" << endl; if(verbosity >1) { 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 >1){ cout << "taille de la boite " << endl; cout << bmin.x << " " << bmin.y << " " << bmin.z << endl; cout << 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 >1) cout << "hseuil=" << hseuil <1) cout << "nv_t = " << nv_t << " / " << "nv_t(anc)" << tab_nv < " << jj << " coord ii " << tab_XX[ii] << " " << tab_YY[ii] << " " << tab_ZZ[ii] << " jj " << tab_XX[jj] << " " << tab_YY[jj] << " " << tab_ZZ[jj] << endl; numberofpointsdiff=1; } } if( numberofpointsdiff==0) numberofpoints=numberofpoints+1; } if(verbosity >1) cout << "numberofpoints " << numberofpoints << endl; if(verbosity >1) 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.; 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));} 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); for(int i=0;i 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); // 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 =2; 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;} 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)} }; 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 split(Th.nt); split=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 ; } //*mp=mps; if (verbosity>1) cout << " -- Trunc mesh: Nb of Tetrahedrons = " << kk << " label=" <