Compare commits
20 Commits
c125d35347
...
24fbc0d923
Author | SHA1 | Date |
---|---|---|
Stéphane Adjemian (Argos) | 24fbc0d923 | |
Sébastien Villemot | fd76ce53af | |
Johannes Pfeifer | 6975aaef43 | |
Sébastien Villemot | ab7d741bf1 | |
Sébastien Villemot | 6f2af6943f | |
Sébastien Villemot | 0d9857e737 | |
Sébastien Villemot | adc42bb4cb | |
Sébastien Villemot | 641cf6a95c | |
Sébastien Villemot | a623cb1d12 | |
Sébastien Villemot | 28fc9e7c78 | |
Sébastien Villemot | d5cffba8fc | |
Sébastien Villemot | 3ebf824f3f | |
Sébastien Villemot | ec48980e1e | |
Sébastien Villemot | ebfd2aa0a1 | |
Sébastien Villemot | 433f00e224 | |
Sébastien Villemot | d61cb124ba | |
Sébastien Villemot | 05d82796c2 | |
Sébastien Villemot | cfa978b39e | |
Sébastien Villemot | 99883d4ca6 | |
Sébastien Villemot | 3053f9b7df |
402
NEWS.md
402
NEWS.md
|
@ -1,3 +1,405 @@
|
||||||
|
Announcement for Dynare 6.0 (on 2024-02-02)
|
||||||
|
===========================================
|
||||||
|
|
||||||
|
We are pleased to announce the release of Dynare 6.0.
|
||||||
|
|
||||||
|
This major release adds new features and fixes various bugs.
|
||||||
|
|
||||||
|
The Windows, macOS, MATLAB Online and source packages are already available for
|
||||||
|
download at [the Dynare website](https://www.dynare.org/download/).
|
||||||
|
|
||||||
|
This release is compatible with MATLAB versions ranging from 9.5 (R2018b) to
|
||||||
|
23.2 (R2023b), and with GNU Octave versions ranging from 7.1.0 to 8.4.0 (NB:
|
||||||
|
the Windows package requires version 8.4.0 specifically).
|
||||||
|
|
||||||
|
Major user-visible changes
|
||||||
|
--------------------------
|
||||||
|
|
||||||
|
- The Sequential Monte Carlo sampler as described by Herbst and Schorfheide
|
||||||
|
(2014) is now available under value `hssmc` for option
|
||||||
|
`posterior_sampling_method`.
|
||||||
|
|
||||||
|
- New routines for perfect foresight simulation with expectation errors. In
|
||||||
|
such a scenario, agents make expectation errors in that the path they had
|
||||||
|
anticipated in period 1 is not realized exactly. More precisely, in some
|
||||||
|
simulation periods, they may receive new information that makes them revise
|
||||||
|
their anticipation for the path of future shocks. Also, under this scenario,
|
||||||
|
it is assumed that agents behave as under perfect foresight, *i.e.* they
|
||||||
|
make their decisions as if there were no uncertainty and they knew exactly
|
||||||
|
the path of future shocks; the new information that they may receive comes
|
||||||
|
as a total surprise to them. Available under new
|
||||||
|
`perfect_foresight_with_expectation_errors_setup` and
|
||||||
|
`perfect_foresight_with_expectation_errors_solver` commands, and
|
||||||
|
`shocks(learnt_in=…)`, `mshocks(learnt_in=…)` and `endval(learnt_in=…)`
|
||||||
|
blocks.
|
||||||
|
|
||||||
|
- New routines for IRF matching with stochastic simulations:
|
||||||
|
|
||||||
|
- Both frequentist (as in Christiano, Eichenbaum, and Evans, 2005) and
|
||||||
|
Bayesian (as in Christiano, Trabandt, and Walentin, 2010) IRF matching
|
||||||
|
approaches are implemented. The core idea of IRF matching is to treat
|
||||||
|
empirical impulse responses (*e.g.* given from an SVAR or local projection
|
||||||
|
estimation) as data and select model parameters that align the model’s
|
||||||
|
IRFs closely with their empirical counterparts.
|
||||||
|
|
||||||
|
- Available under option `mom_method = irf_matching` option to the
|
||||||
|
`method_of_moments` command.
|
||||||
|
|
||||||
|
- New blocks `matched_irfs` and `matched_irfs_weights` for specifying the
|
||||||
|
values and weights of the empirical impulse response functions.
|
||||||
|
|
||||||
|
- Pruning à la Andreasen et al. (2018) is now available at an arbitrary
|
||||||
|
approximation order when performing stochastic simulations with
|
||||||
|
`stoch_simul`, and at 3rd order when performing particle filtering.
|
||||||
|
|
||||||
|
- New `log` option to the `var` statement. In addition to the endogenous
|
||||||
|
variable(s) thus declared, this option also triggers the creation of
|
||||||
|
auxiliary variable(s) equal to the log of the corresponding endogenous
|
||||||
|
variable(s). For example, given a `var(log) y;` statement, two endogenous
|
||||||
|
will be created (`y` and `LOG_y`), and an auxiliary equation linking the two
|
||||||
|
will also be added (equal to `y = exp(LOG_y);`). Moreover, every occurrence
|
||||||
|
of `y` in the model will be replaced by `exp(LOG_y)`. This option is, for
|
||||||
|
example, useful for performing a loglinear approximation of some variable(s)
|
||||||
|
in the context of a first-order stochastic approximation; or for ensuring
|
||||||
|
that the variable(s) stay(s) in the definition domain of the function
|
||||||
|
defining the steady state or the dynamic residuals when the nonlinear solver
|
||||||
|
is used.
|
||||||
|
|
||||||
|
- New model editing features
|
||||||
|
|
||||||
|
- Multiple `model` blocks are now supported (this was already working but
|
||||||
|
not explicitly documented).
|
||||||
|
|
||||||
|
- Multiple `estimated_params` blocks now concatenate their contents (instead
|
||||||
|
of overwriting previous ones, which was the former undocumented behavior);
|
||||||
|
an `overwrite` option has been added to provide the old behavior.
|
||||||
|
|
||||||
|
- New `model_options` statement to set model options in a global fashion.
|
||||||
|
|
||||||
|
- New `model_remove` command to remove equations.
|
||||||
|
|
||||||
|
- New `model_replace` block to replace equations.
|
||||||
|
|
||||||
|
- New `var_remove` command to remove variables (or parameters).
|
||||||
|
|
||||||
|
- New `estimated_params_remove` block to remove estimated parameters.
|
||||||
|
|
||||||
|
- Stochastic simulations
|
||||||
|
|
||||||
|
- Performance improvements for simulation of the solution under perturbation
|
||||||
|
and for particle filtering at higher order (⩾ 3).
|
||||||
|
|
||||||
|
- Performance improvement for the first order perturbation solution using
|
||||||
|
either cycle reduction (`dr=cycle_reduction` option) or logarithmic
|
||||||
|
reduction (`dr=logarithmic_reduction`).
|
||||||
|
|
||||||
|
- New `nomodelsummary` option to the `stoch_simul` command, to suppress the
|
||||||
|
printing of the model summary and the covariance of the exogenous shocks.
|
||||||
|
|
||||||
|
- Estimation
|
||||||
|
|
||||||
|
- A truncated normal distribution can now be specified as a prior, using the
|
||||||
|
3rd and 4th parameters of the `estimated_params` block as the bounds.
|
||||||
|
|
||||||
|
- New `conditional_likelihood` option to the `estimation` command. When the
|
||||||
|
option is set, instead of using the Kalman filter to evaluate the
|
||||||
|
likelihood, Dynare will evaluate the conditional likelihood based on the
|
||||||
|
first-order reduced form of the model by assuming that the initial state
|
||||||
|
vector is at its steady state.
|
||||||
|
|
||||||
|
- New `additional_optimizer_steps` option to the `estimation` command to
|
||||||
|
trigger the sequential execution of several optimizers when looking for
|
||||||
|
the posterior mode.
|
||||||
|
|
||||||
|
- The `generate_trace_plots` command now allows comparing multiple chains.
|
||||||
|
|
||||||
|
- The Geweke and Raftery-Lewis convergence diagnostics will now also be
|
||||||
|
displayed when `mh_nblocks>1`.
|
||||||
|
|
||||||
|
- New `robust`, `TolGstep`, and `TolGstepRel` options to the optimizer
|
||||||
|
available under `mode_compute=5` (“newrat”).
|
||||||
|
|
||||||
|
- New `brooks_gelman_plotrows` option to the `estimation` command for
|
||||||
|
controlling the number of parameters to depict along the rows of the
|
||||||
|
figures depicting the Brooks and Gelman (1998) convergence diagnostics.
|
||||||
|
|
||||||
|
- New `mh_init_scale_factor` option to the `estimation` command tor govern
|
||||||
|
the overdispersion of the starting draws when initializing several Monte
|
||||||
|
Carlo Markov Chains. This option supersedes the `mh_init_scale` option,
|
||||||
|
which is now deprecated.
|
||||||
|
|
||||||
|
- Steady state computation
|
||||||
|
|
||||||
|
- Steady state computation now accounts for occasionally-binding constraints
|
||||||
|
of mixed-complementarity problems (as defined by `mcp` tags).
|
||||||
|
|
||||||
|
- New `tolx` option to the `steady` command for governing the termination
|
||||||
|
based on the step tolerance.
|
||||||
|
|
||||||
|
- New `fsolve_options` option to the `steady` command for passing options to
|
||||||
|
`fsolve` (in conjunction with the `solve_algo=0` option).
|
||||||
|
|
||||||
|
- New option `from_initval_to_endval` option to the `homotopy_setup` block,
|
||||||
|
for easily computing homotopy from initial to terminal steady state (when
|
||||||
|
the former is already computed).
|
||||||
|
|
||||||
|
- New `non_zero` option to `resid` command to restrict display to non-zero
|
||||||
|
residuals.
|
||||||
|
|
||||||
|
- Perfect foresight
|
||||||
|
|
||||||
|
- Significant performance improvement of the `stack_solve_algo=1` option to
|
||||||
|
the `perfect_foresight_solver` command (Laffargue-Boucekkine-Juillard
|
||||||
|
algorithm) when used in conjunction with options `block` and/or `bytecode`
|
||||||
|
of the `model` block.
|
||||||
|
|
||||||
|
- New `relative_to_initval` option to the `mshocks` block, to use the
|
||||||
|
initial steady state as a basis for the multiplication when there is an
|
||||||
|
`endval` block.
|
||||||
|
|
||||||
|
- New `static_mfs` option to the `model` block (and to the `model_options`
|
||||||
|
command), for controlling the minimum feedback set computation for the
|
||||||
|
static model. It defaults to `0` (corresponding to the behavior in Dynare
|
||||||
|
version 5).
|
||||||
|
|
||||||
|
- Various improvements to homotopy
|
||||||
|
|
||||||
|
- New `endval_steady` option to the `perfect_foresight_setup` command for
|
||||||
|
computing the terminal steady state at the same time as the transitory
|
||||||
|
dynamics (and new options `steady_solve_algo`, `steady_tolf`,
|
||||||
|
`steady_tolx`, `steady_maxit` and `steady_markowitz` for controlling the
|
||||||
|
steady state nonlinear solver).
|
||||||
|
|
||||||
|
- New `homotopy_linearization_fallback` and
|
||||||
|
`homotopy_marginal_linearization_fallback` options to the
|
||||||
|
`perfect_foresight_solver` command to get an approximate solution when
|
||||||
|
homotopy fails to go to 100%.
|
||||||
|
|
||||||
|
- New `homotopy_initial_step_size`, `homotopy_min_step_size`,
|
||||||
|
`homotopy_step_size_increase_success_count` and
|
||||||
|
`homotopy_max_completion_share` options to the
|
||||||
|
`perfect_foresight_solver` command to fine tune the homotopy behavior.
|
||||||
|
|
||||||
|
- Purely backward, forward and static models are now supported by the
|
||||||
|
homotopy procedure.
|
||||||
|
|
||||||
|
- The `stack_solve_algo=1` and `stack_solve_algo=6` options of the
|
||||||
|
`perfect_foresight_solver` command were merged and are now synonymous.
|
||||||
|
They both provide the Laffargue-Boucekkine-Juillard algorithm and work
|
||||||
|
with and without the `block` and `bytecode` options of the `model` block.
|
||||||
|
Using `stack_solve_algo=1` is now recommended, but `stack_solve_algo=6` is
|
||||||
|
kept for backward compatibility.
|
||||||
|
|
||||||
|
- OccBin
|
||||||
|
|
||||||
|
- New `simul_reset_check_ahead_periods` option to the `occbin_setup` and
|
||||||
|
`occbin_solver` commands, for resetting `check_ahead_periods` in each
|
||||||
|
simulation period.
|
||||||
|
|
||||||
|
- new `simul_max_check_ahead_periods`, `likelihood_max_check_ahead_periods`,
|
||||||
|
and `smoother_max_check_ahead_periods` options to the `occbin_setup`
|
||||||
|
command, for truncating the number of periods for which agents check ahead
|
||||||
|
which regime is present.
|
||||||
|
|
||||||
|
- Optimal policy
|
||||||
|
|
||||||
|
- The `osr` command now accepts the `analytic_derivation` and
|
||||||
|
`analytic_derivation_mode` options.
|
||||||
|
|
||||||
|
- The `evaluate_planner_objective` command now computes the unconditional
|
||||||
|
welfare for higher-order approximations (⩾ 3).
|
||||||
|
|
||||||
|
- New `periods` and `drop` options to the `evaluate_planner_objective`
|
||||||
|
command.
|
||||||
|
|
||||||
|
- Semi-structural models
|
||||||
|
|
||||||
|
- New `pac_target_info` block for decomposing the PAC target into an
|
||||||
|
arbitrary number of components. Furthermore, in the presence of such a
|
||||||
|
block, the new `pac_target_nonstationary` operator can be used to select
|
||||||
|
the non stationary part of the target (typically useful in the error
|
||||||
|
correction term of the PAC equation).
|
||||||
|
|
||||||
|
- New `kind` option to the `pac_model` command. This option allows the user
|
||||||
|
to select the formula used to compute the weights on the VAR companion
|
||||||
|
matrix variables that are used to form PAC expectations.
|
||||||
|
|
||||||
|
- Performance improvement to `solve_algo=12` and `solve_algo=14`, which
|
||||||
|
significantly accelerates the simulation of purely backward, forward and
|
||||||
|
static models with the `perfect_foresight_solver` command and the routines
|
||||||
|
for semi-structural models.
|
||||||
|
|
||||||
|
- dseries classes
|
||||||
|
|
||||||
|
- The `remove` and `remove_` methods now accept a list of variables (they
|
||||||
|
would previously only accept a single variable).
|
||||||
|
|
||||||
|
- New MATLAB/Octave command `dplot` to plot mathematical expressions
|
||||||
|
generated from variables fetched from (different) dseries objects.
|
||||||
|
|
||||||
|
- Misc
|
||||||
|
|
||||||
|
- New `display_parameter_values` command to print the parameter values in
|
||||||
|
the command window.
|
||||||
|
|
||||||
|
- New `collapse_figures_in_tabgroup` command to dock all figures.
|
||||||
|
|
||||||
|
- Performance improvement for the `use_dll` option of the `model` block. The
|
||||||
|
preprocessor now takes advantage of parallelization when compiling the MEX
|
||||||
|
files.
|
||||||
|
|
||||||
|
- New mathematical primitives available: complementary error function
|
||||||
|
(`erfc`), hyperbolic functions (`cosh`, `sinh`, `tanh`, `acosh`, `asinh`,
|
||||||
|
`atanh`).
|
||||||
|
|
||||||
|
- New `last_simulation_period` option to the `initval_file` command.
|
||||||
|
|
||||||
|
- The `calib_smoother` command now accepts the `nobs` and
|
||||||
|
`heteroskedastic_filter` options.
|
||||||
|
|
||||||
|
- Under the MATLAB Desktop, autocompletion is now available for the `dynare`
|
||||||
|
command and other CLI commands (thanks to Eduard Benet Cerda from
|
||||||
|
MathWorks).
|
||||||
|
|
||||||
|
- Model debugging: The preprocessor now creates files for evaluating the
|
||||||
|
left- and right-hand sides of model equations separately. For a model file
|
||||||
|
called `ramst.mod`, you can call
|
||||||
|
`[lhs,rhs]=ramst.debug.static_resid(y,x,params);` (for the static model)
|
||||||
|
and `[lhs,rhs]=ramst.debug.dynamic_resid(y,x,params,steady_state);` (for
|
||||||
|
the dynamic model), where `y` are the endogenous, `x` the exogenous,
|
||||||
|
`params` the parameters, and `steady_state` is self-explanatory. NB: In
|
||||||
|
the dynamic case, the vector `y` of endogenous must have 3n elements
|
||||||
|
where n is the number of endogenous (including auxiliary ones); the
|
||||||
|
first n elements correspond to the lagged values, the middle n
|
||||||
|
elements to the contemporaneous values, and the last n elements to the
|
||||||
|
lead values.
|
||||||
|
|
||||||
|
- New interactive MATLAB/Octave command `search` for listing the equations
|
||||||
|
in which given variable(s) appear (requires `json` command line option).
|
||||||
|
|
||||||
|
- The `model_info` command allows to print the block decomposition even if
|
||||||
|
the `block` option of the `model` block has not been used, by specifying
|
||||||
|
the new options `block_static` and `block_dynamic`.
|
||||||
|
|
||||||
|
- There is now a default value for the global initialization file
|
||||||
|
(`GlobalInitFile` option of the configuration file): the `global_init.m`
|
||||||
|
in the Dynare configuration directory (typically
|
||||||
|
`$HOME/.config/dynare/global_init.m` under Linux and macOS, and
|
||||||
|
`c:\Users\USERNAME\AppData\Roaming\dynare\global_init.m` under Windows).
|
||||||
|
|
||||||
|
- For those compiling Dynare from source, the build system has been entirely
|
||||||
|
rewritten and now uses Meson; as a consequence, it is now faster and
|
||||||
|
easier to understand.
|
||||||
|
|
||||||
|
- References:
|
||||||
|
|
||||||
|
- Andreasen, Martin M., Jesús Fernández-Villaverde, and Juan Rubio-Ramírez
|
||||||
|
(2018): “The Pruned State-Space System for Non-Linear DSGE Models: Theory
|
||||||
|
and Empirical Applications,” *Review of Economic Studies*, 85(1), 1-49.
|
||||||
|
- Brooks, Stephen P., and Andrew Gelman (1998): “General methods for
|
||||||
|
monitoring convergence of iterative simulations,” *Journal of Computational
|
||||||
|
and Graphical Statistics*, 7, pp. 434–455.
|
||||||
|
- Christiano, Eichenbaum and Charles L. Evans (2005): “Nominal Rigidities and
|
||||||
|
the Dynamic Effects of a Shock to Monetary Policy,” *Journal of Political
|
||||||
|
Economy*, 113(1), 1–45.
|
||||||
|
- Christiano, Lawrence J., Mathias Trabandt, and Karl Walentin (2010): “DSGE
|
||||||
|
Models for Monetary Policy Analysis,” In: *Handbook of Monetary Economics
|
||||||
|
3*, 285–367.
|
||||||
|
- Herbst, Edward and Schorfheide, Frank (2014): "Sequential Monte Carlo
|
||||||
|
Sampling for DSGE Models," *Journal of Applied Econometrics*, 29,
|
||||||
|
1073-1098.
|
||||||
|
|
||||||
|
Incompatible changes
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
- The default value of the `mode_compute` option of the `estimation` command
|
||||||
|
has been changed to `5` (it was previously `4`).
|
||||||
|
|
||||||
|
- When using block decomposition (with the `block` option of the `model`
|
||||||
|
block), the option `mfs` now defaults to `1`. This setting should deliver
|
||||||
|
better performance in perfect foresight simulation on most models.
|
||||||
|
|
||||||
|
- The default location for the configuration file has changed. On Linux and
|
||||||
|
macOS, the configuration file is now searched by default under
|
||||||
|
`dynare/dynare.ini` in the configuration directories defined by the XDG
|
||||||
|
specification (typically `$HOME/.config/dynare/dynare.ini` for the
|
||||||
|
user-specific configuration and `/etc/xdg/dynare/dynare.ini` for the
|
||||||
|
system-wide configuration, the former having precedence over the latter).
|
||||||
|
Under Windows, the configuration file is now searched by default in
|
||||||
|
`%APPDATA%\dynare\dynare.ini` (typically
|
||||||
|
`c:\Users\USERNAME\AppData\Roaming\dynare\dynare.ini`).
|
||||||
|
|
||||||
|
- The information stored in `oo_.endo_simul, oo_.exo_simul`, and `oo_.irfs` is
|
||||||
|
no longer duplicated in the base workspace. New helper functions
|
||||||
|
`send_endogenous_variables_to_workspace`,
|
||||||
|
`send_exogenous_variables_to_workspace`, and `send_irfs_to_workspace` have
|
||||||
|
been introduced to explicitly request these outputs and to mimic the old
|
||||||
|
behavior.
|
||||||
|
|
||||||
|
- The `dynare_sensitivity` command has been renamed `sensitivity`. The old
|
||||||
|
name is still accepted but triggers a warning.
|
||||||
|
|
||||||
|
- The syntax `resid(1)` is no longer supported.
|
||||||
|
|
||||||
|
- The `mode_compute=6` option to the `estimation` command now recursively
|
||||||
|
updates the covariance matrix across the `NumberOfMh` Metropolis-Hastings
|
||||||
|
runs, starting with the `InitialCovarianceMatrix` in the first run, instead
|
||||||
|
of computing it from scratch in every Metropolis-Hastings run.
|
||||||
|
|
||||||
|
- The `periods` command has been removed.
|
||||||
|
|
||||||
|
- The `Sigma_e` command has been removed.
|
||||||
|
|
||||||
|
- The `block` option of the `model` block no longer has an effect when used in
|
||||||
|
conjunction with `stoch_simul` or `estimation` commands.
|
||||||
|
|
||||||
|
- The Dynare++ executable is no longer distributed since almost all of its
|
||||||
|
functionalities have been integrated inside Dynare for MATLAB/Octave.
|
||||||
|
|
||||||
|
- A macro-processor variable defined without a value (such as `@#define var`
|
||||||
|
in the `.mod` file or alternatively `-Dvar` on the `dynare` command line) is
|
||||||
|
now assigned the `true` logical value (it was previously assigned `1`).
|
||||||
|
|
||||||
|
- The `parallel_slave_open_mode` option of the `dynare` command has been
|
||||||
|
renamed `parallel_follower_open_mode`.
|
||||||
|
|
||||||
|
- The `static` option of the `model_info` command is now deprecated and is
|
||||||
|
replaced by the `block_static` option.
|
||||||
|
|
||||||
|
Bugs that were present in 5.5 and that have been fixed in 6.0
|
||||||
|
-------------------------------------------------------------
|
||||||
|
|
||||||
|
* The `mh_initialize_from_previous_mcmc` option of the `estimation` command
|
||||||
|
would not work if estimation was conducted with a different prior and the
|
||||||
|
last draw in the previous MCMC fell outside the new prior bounds
|
||||||
|
* When specifying a generalized inverse Gamma prior, the hyperparameter
|
||||||
|
computation would erroneously ignore the resulting mean shift
|
||||||
|
* When using the `mh_recover` option of the `estimation` command, the status
|
||||||
|
bar always started at zero instead of showing the overall progress of the
|
||||||
|
recovered chain
|
||||||
|
* The `model_diagnostics` command would fail to check the correctness of
|
||||||
|
user-defined steady state files
|
||||||
|
* GSA: LaTeX output was not working as expected
|
||||||
|
* Forecasts and filtered variables could not be retrieved with the
|
||||||
|
`heteroskedastic_shocks` block
|
||||||
|
* The OccBin smoother would potentially not display all smoothed shocks with
|
||||||
|
`heteroskedastic_filter` option
|
||||||
|
* The OccBin smoother would crash if the number of requested periods was
|
||||||
|
smaller than the data length
|
||||||
|
* The multivariate OccBin smoother would return wrong results if the constraint
|
||||||
|
was binding in the first period
|
||||||
|
* The `plot_shock_decomposition` command would fail with the `init2shocks`
|
||||||
|
block if the `initial_condition_decomposition` was not run before
|
||||||
|
* LaTeX output under Windows failed to compile for `plot_priors=1` option of
|
||||||
|
the `estimation` command and Brooks and Gelman (1998) convergence diagnostics
|
||||||
|
* The plot produced by the `shock_decomposition` command was too big, making
|
||||||
|
the close button inaccessible
|
||||||
|
* Monthly dates for October, November and December (*i.e.* with a 2-digit month
|
||||||
|
number) were not properly interpreted by the preprocessor
|
||||||
|
* Theoretical moments computed by `stoch_simul` at `order=2` with `pruning`
|
||||||
|
would not contain unconditional and conditional variance decomposition
|
||||||
|
|
||||||
|
|
||||||
Announcement for Dynare 5.5 (on 2023-10-23)
|
Announcement for Dynare 5.5 (on 2023-10-23)
|
||||||
===========================================
|
===========================================
|
||||||
|
|
||||||
|
|
|
@ -16,8 +16,8 @@ Bibliography
|
||||||
* Bini, Dario A., Guy Latouche, and Beatrice Meini (2002): “Solving matrix polynomial equations arising in queueing problems,” *Linear Algebra and its Applications*, 340, 225–244.
|
* Bini, Dario A., Guy Latouche, and Beatrice Meini (2002): “Solving matrix polynomial equations arising in queueing problems,” *Linear Algebra and its Applications*, 340, 225–244.
|
||||||
* Born, Benjamin and Johannes Pfeifer (2014): “Policy risk and the business cycle”, *Journal of Monetary Economics*, 68, 68-85.
|
* Born, Benjamin and Johannes Pfeifer (2014): “Policy risk and the business cycle”, *Journal of Monetary Economics*, 68, 68-85.
|
||||||
* Boucekkine, Raouf (1995): “An alternative methodology for solving nonlinear forward-looking models,” *Journal of Economic Dynamics and Control*, 19, 711–734.
|
* Boucekkine, Raouf (1995): “An alternative methodology for solving nonlinear forward-looking models,” *Journal of Economic Dynamics and Control*, 19, 711–734.
|
||||||
* Brayton, Flint and Peter Tinsley (1996): "A Guide to FRB/US: A Macroeconomic Model of the United States", *Finance and Economics Discussion Series*, 1996-42.
|
* Brayton, Flint and Peter Tinsley (1996): “A Guide to FRB/US: A Macroeconomic Model of the United States,” *Finance and Economics Discussion Series*, 1996-42.
|
||||||
* Brayton, Flint, Morris Davis and Peter Tulip (2000): "Polynomial Adjustment Costs in FRB/US", *Unpublished manuscript*.
|
* Brayton, Flint, Morris Davis and Peter Tulip (2000): “Polynomial Adjustment Costs in FRB/US,” *Unpublished manuscript*.
|
||||||
* Brooks, Stephen P., and Andrew Gelman (1998): “General methods for monitoring convergence of iterative simulations,” *Journal of Computational and Graphical Statistics*, 7, pp. 434–455.
|
* Brooks, Stephen P., and Andrew Gelman (1998): “General methods for monitoring convergence of iterative simulations,” *Journal of Computational and Graphical Statistics*, 7, pp. 434–455.
|
||||||
* Cardoso, Margarida F., R. L. Salcedo and S. Feyo de Azevedo (1996): “The simplex simulated annealing approach to continuous non-linear optimization,” *Computers & Chemical Engineering*, 20(9), 1065-1080.
|
* Cardoso, Margarida F., R. L. Salcedo and S. Feyo de Azevedo (1996): “The simplex simulated annealing approach to continuous non-linear optimization,” *Computers & Chemical Engineering*, 20(9), 1065-1080.
|
||||||
* Chib, Siddhartha and Srikanth Ramamurthy (2010): “Tailored randomized block MCMC methods with application to DSGE models,” *Journal of Econometrics*, 155, 19–38.
|
* Chib, Siddhartha and Srikanth Ramamurthy (2010): “Tailored randomized block MCMC methods with application to DSGE models,” *Journal of Econometrics*, 155, 19–38.
|
||||||
|
@ -29,7 +29,7 @@ Bibliography
|
||||||
* Collard, Fabrice and Michel Juillard (2001a): “Accuracy of stochastic perturbation methods: The case of asset pricing models,” *Journal of Economic Dynamics and Control*, 25, 979–999.
|
* Collard, Fabrice and Michel Juillard (2001a): “Accuracy of stochastic perturbation methods: The case of asset pricing models,” *Journal of Economic Dynamics and Control*, 25, 979–999.
|
||||||
* Collard, Fabrice and Michel Juillard (2001b): “A Higher-Order Taylor Expansion Approach to Simulation of Stochastic Forward-Looking Models with an Application to a Non-Linear Phillips Curve,” *Computational Economics*, 17, 125–139.
|
* Collard, Fabrice and Michel Juillard (2001b): “A Higher-Order Taylor Expansion Approach to Simulation of Stochastic Forward-Looking Models with an Application to a Non-Linear Phillips Curve,” *Computational Economics*, 17, 125–139.
|
||||||
* Corana, Angelo, M. Marchesi, Claudio Martini, and Sandro Ridella (1987): “Minimizing multimodal functions of continuous variables with the “simulated annealing” algorithm”, *ACM Transactions on Mathematical Software*, 13(3), 262–280.
|
* Corana, Angelo, M. Marchesi, Claudio Martini, and Sandro Ridella (1987): “Minimizing multimodal functions of continuous variables with the “simulated annealing” algorithm”, *ACM Transactions on Mathematical Software*, 13(3), 262–280.
|
||||||
* Cuba-Borda, Pablo, Luca Guerrieri, Matteo Iacoviello, and Molin Zhong (2019): "Likelihood evaluation of models with occasionally binding constraints", Journal of Applied Econometrics, 34(7), 1073-1085
|
* Cuba-Borda, Pablo, Luca Guerrieri, Matteo Iacoviello, and Molin Zhong (2019): “Likelihood evaluation of models with occasionally binding constraints,” Journal of Applied Econometrics, 34(7), 1073-1085
|
||||||
* Del Negro, Marco and Frank Schorfheide (2004): “Priors from General Equilibrium Models for VARs”, *International Economic Review*, 45(2), 643–673.
|
* Del Negro, Marco and Frank Schorfheide (2004): “Priors from General Equilibrium Models for VARs”, *International Economic Review*, 45(2), 643–673.
|
||||||
* Dennis, Richard (2007): “Optimal Policy In Rational Expectations Models: New Solution Algorithms”, *Macroeconomic Dynamics*, 11(1), 31–55.
|
* Dennis, Richard (2007): “Optimal Policy In Rational Expectations Models: New Solution Algorithms”, *Macroeconomic Dynamics*, 11(1), 31–55.
|
||||||
* Duffie, Darrel and Kenneth J. Singleton (1993): “Simulated Moments Estimation of Markov Models of Asset Prices”, *Econometrica*, 61(4), 929-952.
|
* Duffie, Darrel and Kenneth J. Singleton (1993): “Simulated Moments Estimation of Markov Models of Asset Prices”, *Econometrica*, 61(4), 929-952.
|
||||||
|
@ -49,7 +49,7 @@ Bibliography
|
||||||
* Hansen, Lars P. (1982): “Large sample properties of generalized method of moments estimators,” Econometrica, 50(4), 1029–1054.
|
* Hansen, Lars P. (1982): “Large sample properties of generalized method of moments estimators,” Econometrica, 50(4), 1029–1054.
|
||||||
* Hansen, Nikolaus and Stefan Kern (2004): “Evaluating the CMA Evolution Strategy on Multimodal Test Functions”. In: *Eighth International Conference on Parallel Problem Solving from Nature PPSN VIII*, Proceedings, Berlin: Springer, 282–291.
|
* Hansen, Nikolaus and Stefan Kern (2004): “Evaluating the CMA Evolution Strategy on Multimodal Test Functions”. In: *Eighth International Conference on Parallel Problem Solving from Nature PPSN VIII*, Proceedings, Berlin: Springer, 282–291.
|
||||||
* Harvey, Andrew C. and Garry D.A. Phillips (1979): “Maximum likelihood estimation of regression models with autoregressive-moving average disturbances,” *Biometrika*, 66(1), 49–58.
|
* Harvey, Andrew C. and Garry D.A. Phillips (1979): “Maximum likelihood estimation of regression models with autoregressive-moving average disturbances,” *Biometrika*, 66(1), 49–58.
|
||||||
* Herbst, Edward and Schorfheide, Frank (2014): "Sequential monte-carlo sampling for DSGE models," *Journal of Applied Econometrics*, 29, 1073-1098.
|
* Herbst, Edward and Schorfheide, Frank (2014): “Sequential Monte Carlo Sampling for DSGE Models,” *Journal of Applied Econometrics*, 29, 1073-1098.
|
||||||
* Herbst, Edward (2015): “Using the “Chandrasekhar Recursions” for Likelihood Evaluation of DSGE Models,” *Computational Economics*, 45(4), 693–705.
|
* Herbst, Edward (2015): “Using the “Chandrasekhar Recursions” for Likelihood Evaluation of DSGE Models,” *Computational Economics*, 45(4), 693–705.
|
||||||
* Ireland, Peter (2004): “A Method for Taking Models to the Data,” *Journal of Economic Dynamics and Control*, 28, 1205–26.
|
* Ireland, Peter (2004): “A Method for Taking Models to the Data,” *Journal of Economic Dynamics and Control*, 28, 1205–26.
|
||||||
* Iskrev, Nikolay (2010): “Local identification in DSGE models,” *Journal of Monetary Economics*, 57(2), 189–202.
|
* Iskrev, Nikolay (2010): “Local identification in DSGE models,” *Journal of Monetary Economics*, 57(2), 189–202.
|
||||||
|
|
|
@ -75,7 +75,7 @@ latex_elements = {
|
||||||
|
|
||||||
latex_documents = [
|
latex_documents = [
|
||||||
(master_doc, 'dynare-manual.tex', u'Dynare Reference Manual',
|
(master_doc, 'dynare-manual.tex', u'Dynare Reference Manual',
|
||||||
u'Dynare team', 'manual'),
|
u'Dynare Team', 'manual'),
|
||||||
]
|
]
|
||||||
|
|
||||||
man_pages = [
|
man_pages = [
|
||||||
|
|
|
@ -281,7 +281,7 @@ Dynare misc commands
|
||||||
|
|
||||||
This option is not mandatory and allows to plot the expressions
|
This option is not mandatory and allows to plot the expressions
|
||||||
only over a sub-range. ``DATE1`` and ``DATE2`` must be dates as
|
only over a sub-range. ``DATE1`` and ``DATE2`` must be dates as
|
||||||
defined in :ref:`dates in mod file`.
|
defined in :ref:`dates in a mod file`.
|
||||||
|
|
||||||
.. option:: --style MATLAB_SCRIPT_NAME
|
.. option:: --style MATLAB_SCRIPT_NAME
|
||||||
|
|
||||||
|
|
|
@ -94,26 +94,24 @@ Citing Dynare in your research
|
||||||
You should cite Dynare if you use it in your research. The
|
You should cite Dynare if you use it in your research. The
|
||||||
recommended way todo this is to cite the present manual, as:
|
recommended way todo this is to cite the present manual, as:
|
||||||
|
|
||||||
Stéphane Adjemian, Houtan Bastani, Michel Juillard, Frédéric Karamé,
|
Stéphane Adjemian, Michel Juillard, Frédéric Karamé, Willi Mutschler,
|
||||||
Ferhat Mihoubi, Willi Mutschler, Johannes Pfeifer, Marco Ratto,
|
Johannes Pfeifer, Marco Ratto, Normann Rion and Sébastien Villemot (2024),
|
||||||
Normann Rion and Sébastien Villemot (2022), “Dynare: Reference Manual,
|
“Dynare: Reference Manual, Version 6,” *Dynare Working Papers*, 80, CEPREMAP
|
||||||
Version 5,” *Dynare Working Papers*, 72, CEPREMAP
|
|
||||||
|
|
||||||
For convenience, you can copy and paste the following into your BibTeX file:
|
For convenience, you can copy and paste the following into your BibTeX file:
|
||||||
|
|
||||||
.. code-block:: bibtex
|
.. code-block:: bibtex
|
||||||
|
|
||||||
@TechReport{Adjemianetal2022,
|
@TechReport{Adjemianetal2024,
|
||||||
author = {Adjemian, St\'ephane and Bastani, Houtan and
|
author = {Adjemian, St\'ephane and Juillard, Michel and
|
||||||
Juillard, Michel and Karam\'e, Fr\'ederic and
|
Karam\'e, Fr\'ederic and Mutschler, Willi and
|
||||||
Mihoubi, Ferhat and Mutschler, Willi
|
Pfeifer, Johannes and Ratto, Marco and
|
||||||
and Pfeifer, Johannes and Ratto, Marco and
|
|
||||||
Rion, Normann and Villemot, S\'ebastien},
|
Rion, Normann and Villemot, S\'ebastien},
|
||||||
title = {Dynare: Reference Manual Version 5},
|
title = {Dynare: Reference Manual, Version 6},
|
||||||
year = {2022},
|
year = {2024},
|
||||||
institution = {CEPREMAP},
|
institution = {CEPREMAP},
|
||||||
type = {Dynare Working Papers},
|
type = {Dynare Working Papers},
|
||||||
number = {72},
|
number = {80},
|
||||||
}
|
}
|
||||||
|
|
||||||
If you want to give a URL, use the address of the Dynare website:
|
If you want to give a URL, use the address of the Dynare website:
|
||||||
|
|
|
@ -3003,19 +3003,23 @@ Finding the steady state with Dynare nonlinear solver
|
||||||
blocks that can be evaluated rather than solved; and evaluations
|
blocks that can be evaluated rather than solved; and evaluations
|
||||||
of the residual and Jacobian of the model are more efficient
|
of the residual and Jacobian of the model are more efficient
|
||||||
because only the relevant elements are recomputed at every
|
because only the relevant elements are recomputed at every
|
||||||
iteration.
|
iteration. This option is typically used with the
|
||||||
|
``perfect_foresight_solver`` command with purely backward,
|
||||||
|
forward or static models, or with routines for semi-structural
|
||||||
|
models, and it must *not* be combined with option ``block`` of
|
||||||
|
the ``model`` block. Also note that for those models, the block
|
||||||
|
decomposition is performed as if ``mfs=3`` had been passed to
|
||||||
|
the ``model`` block, and the decomposition is slightly
|
||||||
|
different because it is computed in a time-recursive fashion
|
||||||
|
(*i.e.* in such a way that the simulation is meant to be done
|
||||||
|
with the outer loop on periods and the inner loop on blocks;
|
||||||
|
while for models with both leads and lags, the outer loop is on
|
||||||
|
blocks and the inner loop is on periods).
|
||||||
|
|
||||||
``14``
|
``14``
|
||||||
|
|
||||||
Computes a block decomposition and then applies a trust region
|
Same as ``12``, except that it applies a trust region solver
|
||||||
solver with autoscaling on those smaller blocks rather than on
|
(similar to ``4``) to the blocks.
|
||||||
the full nonlinear system. This is similar to ``4``, but is
|
|
||||||
typically more efficient. The block decomposition is done at
|
|
||||||
the preprocessor level, which brings two benefits: it
|
|
||||||
identifies blocks that can be evaluated rather than solved; and
|
|
||||||
evaluations of the residual and Jacobian of the model are more
|
|
||||||
efficient because only the relevant elements are recomputed at
|
|
||||||
every iteration.
|
|
||||||
|
|
||||||
|br| Default value is ``4``.
|
|br| Default value is ``4``.
|
||||||
|
|
||||||
|
@ -3738,7 +3742,7 @@ speed-up on large models.
|
||||||
solvers available through option ``solve_algo``, applied on the
|
solvers available through option ``solve_algo``, applied on the
|
||||||
stacked system of all equations in all periods (See
|
stacked system of all equations in all periods (See
|
||||||
:ref:`solve_algo <solvalg>` for a list of possible values, note
|
:ref:`solve_algo <solvalg>` for a list of possible values, note
|
||||||
that values 5, 6, 7 and 8, which require ``bytecode`` and/or
|
that values ``5``, ``6``, ``7`` and ``8``, which require ``bytecode`` and/or
|
||||||
``block`` options, are not allowed). For instance, the following
|
``block`` options, are not allowed). For instance, the following
|
||||||
commands::
|
commands::
|
||||||
|
|
||||||
|
@ -3756,7 +3760,10 @@ speed-up on large models.
|
||||||
.. option:: solve_algo
|
.. option:: solve_algo
|
||||||
|
|
||||||
See :ref:`solve_algo <solvalg>`. Allows selecting the solver
|
See :ref:`solve_algo <solvalg>`. Allows selecting the solver
|
||||||
used with ``stack_solve_algo=7``.
|
used with ``stack_solve_algo=7``. Also used for purely backward, forward
|
||||||
|
and static models (when neither the ``block`` nor the ``bytecode`` option
|
||||||
|
of the ``model`` block is specified); for those models, the values
|
||||||
|
``12`` and ``14`` are especially relevant.
|
||||||
|
|
||||||
.. option:: no_homotopy
|
.. option:: no_homotopy
|
||||||
|
|
||||||
|
@ -5774,6 +5781,14 @@ All of these elements are discussed in the following.
|
||||||
|
|
||||||
See :opt:`simul_check_ahead_periods <simul_check_ahead_periods = INTEGER>`.
|
See :opt:`simul_check_ahead_periods <simul_check_ahead_periods = INTEGER>`.
|
||||||
|
|
||||||
|
.. option:: simul_reset_check_ahead_periods
|
||||||
|
|
||||||
|
See :opt:`simul_reset_check_ahead_periods`.
|
||||||
|
|
||||||
|
.. option:: simul_max_check_ahead_periods
|
||||||
|
|
||||||
|
See :opt:`simul_max_check_ahead_periods <simul_max_check_ahead_periods = INTEGER>`.
|
||||||
|
|
||||||
.. option:: simul_curb_retrench
|
.. option:: simul_curb_retrench
|
||||||
|
|
||||||
See :opt:`simul_curb_retrench`.
|
See :opt:`simul_curb_retrench`.
|
||||||
|
@ -6513,7 +6528,7 @@ observed variables.
|
||||||
Note however that the conditional likelihood is sensitive to the choice
|
Note however that the conditional likelihood is sensitive to the choice
|
||||||
for the initial condition, which can be an issue if the data are
|
for the initial condition, which can be an issue if the data are
|
||||||
initially far from the steady state. This option is not compatible with
|
initially far from the steady state. This option is not compatible with
|
||||||
``analytical_derivation``.
|
``analytic_derivation``.
|
||||||
|
|
||||||
.. option:: conf_sig = DOUBLE
|
.. option:: conf_sig = DOUBLE
|
||||||
|
|
||||||
|
@ -14262,7 +14277,7 @@ assumed that each equation is written as ``VARIABLE = EXPRESSION`` or
|
||||||
``T(VARIABLE) = EXPRESSION`` where ``T(VARIABLE)`` stands for a transformation
|
``T(VARIABLE) = EXPRESSION`` where ``T(VARIABLE)`` stands for a transformation
|
||||||
of an endogenous variable (``log`` or ``diff``). This representation, where each
|
of an endogenous variable (``log`` or ``diff``). This representation, where each
|
||||||
equation determines the endogenous variable on the LHS, can be exploited when
|
equation determines the endogenous variable on the LHS, can be exploited when
|
||||||
simulating the model (see algorithms 12 and 14 in :ref:`solve_algo <solvalg>`)
|
simulating the model (see algorithms ``12`` and ``14`` in :ref:`solve_algo <solvalg>`)
|
||||||
and is mandatory to define auxiliary models used for computing expectations (see
|
and is mandatory to define auxiliary models used for computing expectations (see
|
||||||
below).
|
below).
|
||||||
|
|
||||||
|
|
|
@ -53,17 +53,16 @@ clean-all: clean-lib clean-src clean-tar
|
||||||
#
|
#
|
||||||
tarballs/slicot-$(SLICOT_VERSION).tar.gz:
|
tarballs/slicot-$(SLICOT_VERSION).tar.gz:
|
||||||
mkdir -p tarballs
|
mkdir -p tarballs
|
||||||
wget $(WGET_OPTIONS) -O $@ https://deb.debian.org/debian/pool/main/s/slicot/slicot_$(SLICOT_VERSION).orig.tar.gz
|
wget $(WGET_OPTIONS) -O $@ https://deb.debian.org/debian/pool/main/s/slicot/slicot_$(SLICOT_VERSION).orig.tar.xz
|
||||||
|
|
||||||
$(DEPS_ARCH)/sources64/slicot-$(SLICOT_VERSION): tarballs/slicot-$(SLICOT_VERSION).tar.gz
|
$(DEPS_ARCH)/sources64/slicot-$(SLICOT_VERSION): tarballs/slicot-$(SLICOT_VERSION).tar.gz
|
||||||
rm -rf $(DEPS_ARCH)/sources64/slicot-*
|
rm -rf $(DEPS_ARCH)/sources64/slicot-*
|
||||||
mkdir -p $@
|
mkdir -p $@
|
||||||
tar xf $< --directory $@ --strip-components=1
|
tar xf $< --directory $@ --strip-components=1
|
||||||
patch -d $@ -p1 < ../../windows/deps/slicot-build-system.patch
|
|
||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
$(DEPS_ARCH)/lib64/slicot/libslicot64_pic.a: $(DEPS_ARCH)/sources64/slicot-$(SLICOT_VERSION)
|
$(DEPS_ARCH)/lib64/slicot/libslicot64_pic.a: $(DEPS_ARCH)/sources64/slicot-$(SLICOT_VERSION)
|
||||||
make -C $< -f makefile_Unix FC=$(BREWDIR)/bin/gfortran LOADER=$(BREWDIR)/bin/gfortran SLICOTLIB=../libslicot64_pic.a FFLAGS="-O3 -fdefault-integer-8" lib -j$(NTHREADS)
|
make -C $< -f makefile_Unix FORTRAN=$(BREWDIR)/bin/gfortran LOADER=$(BREWDIR)/bin/gfortran SLICOTLIB=../libslicot64_pic.a OPTS="-O3 -fdefault-integer-8" lib -j$(NTHREADS)
|
||||||
strip -S $</libslicot64_pic.a
|
strip -S $</libslicot64_pic.a
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
cp $</libslicot64_pic.a $@
|
cp $</libslicot64_pic.a $@
|
||||||
|
|
|
@ -1,2 +1,2 @@
|
||||||
SLICOT_VERSION = 5.8+20230223.git401037e
|
SLICOT_VERSION = 5.9~20240205.gita037f7e
|
||||||
X13AS_VERSION = 1-1-b60
|
X13AS_VERSION = 1-1-b60
|
||||||
|
|
|
@ -93,7 +93,8 @@ function DERIVS = get_perturbation_params_derivs(M_, options_, estim_params_, dr
|
||||||
% This function calls
|
% This function calls
|
||||||
% * [fname,'.dynamic']
|
% * [fname,'.dynamic']
|
||||||
% * [fname,'.dynamic_params_derivs']
|
% * [fname,'.dynamic_params_derivs']
|
||||||
% * [fname,'.static']
|
% * [fname,'.sparse.static_g1']
|
||||||
|
% * [fname,'.sparse.static_g2']
|
||||||
% * [fname,'.static_params_derivs']
|
% * [fname,'.static_params_derivs']
|
||||||
% * commutation
|
% * commutation
|
||||||
% * dyn_vech
|
% * dyn_vech
|
||||||
|
@ -109,7 +110,7 @@ function DERIVS = get_perturbation_params_derivs(M_, options_, estim_params_, dr
|
||||||
% * sylvester3a
|
% * sylvester3a
|
||||||
% * get_perturbation_params_derivs_numerical_objective
|
% * get_perturbation_params_derivs_numerical_objective
|
||||||
% =========================================================================
|
% =========================================================================
|
||||||
% Copyright © 2019-2020 Dynare Team
|
% Copyright © 2019-2024 Dynare Team
|
||||||
%
|
%
|
||||||
% This file is part of Dynare.
|
% This file is part of Dynare.
|
||||||
%
|
%
|
||||||
|
@ -454,12 +455,13 @@ elseif (analytic_derivation_mode == 0 || analytic_derivation_mode == 1)
|
||||||
error('For analytical parameter derivatives ''dynamic_params_derivs.m'' file is needed, this can be created by putting identification(order=%d) into your mod file.',order)
|
error('For analytical parameter derivatives ''dynamic_params_derivs.m'' file is needed, this can be created by putting identification(order=%d) into your mod file.',order)
|
||||||
end
|
end
|
||||||
%% Analytical computation of Jacobian and Hessian (wrt selected model parameters) of steady state, i.e. dYss and d2Yss
|
%% Analytical computation of Jacobian and Hessian (wrt selected model parameters) of steady state, i.e. dYss and d2Yss
|
||||||
[~, g1_static] = feval([fname,'.static'], ys, exo_steady_state', params); %g1_static is [endo_nbr by endo_nbr] first-derivative (wrt all endogenous variables) of static model equations f, i.e. df/dys, in declaration order
|
[g1_static, T_order_static, T_static] = feval([fname,'.sparse.static_g1'], ys, exo_steady_state', params, M_.static_g1_sparse_rowval, M_.static_g1_sparse_colval, M_.static_g1_sparse_colptr); %g1_static is [endo_nbr by endo_nbr] first-derivative (wrt all endogenous variables) of static model equations f, i.e. df/dys, in declaration order
|
||||||
rp_static = feval([fname,'.static_params_derivs'], ys, exo_steady_state', params); %rp_static is [endo_nbr by param_nbr] first-derivative (wrt all model parameters) of static model equations f, i.e. df/dparams, in declaration order
|
rp_static = feval([fname,'.static_params_derivs'], ys, exo_steady_state', params); %rp_static is [endo_nbr by param_nbr] first-derivative (wrt all model parameters) of static model equations f, i.e. df/dparams, in declaration order
|
||||||
dys = -g1_static\rp_static; %use implicit function theorem (equation 5 of Ratto and Iskrev (2012) to compute [endo_nbr by param_nbr] first-derivative (wrt all model parameters) of steady state for all endogenous variables analytically, note that dys is in declaration order
|
dys = -g1_static\rp_static; %use implicit function theorem (equation 5 of Ratto and Iskrev (2012) to compute [endo_nbr by param_nbr] first-derivative (wrt all model parameters) of steady state for all endogenous variables analytically, note that dys is in declaration order
|
||||||
d2ys = zeros(endo_nbr, param_nbr, param_nbr); %initialize in tensor notation, note that d2ys is only needed for d2flag, i.e. for g1pp
|
d2ys = zeros(endo_nbr, param_nbr, param_nbr); %initialize in tensor notation, note that d2ys is only needed for d2flag, i.e. for g1pp
|
||||||
if d2flag
|
if d2flag
|
||||||
[~, ~, g2_static] = feval([fname,'.static'], ys, exo_steady_state', params); %g2_static is [endo_nbr by endo_nbr^2] second derivative (wrt all endogenous variables) of static model equations f, i.e. d(df/dys)/dys, in declaration order
|
g2_static_v = feval([fname,'.sparse.static_g2'], ys, exo_steady_state', params, T_order_static, T_static);
|
||||||
|
g2_static = build_two_dim_hessian(M_.static_g2_sparse_indices, g2_static_v, endo_nbr, endo_nbr); %g2_static is [endo_nbr by endo_nbr^2] second derivative (wrt all endogenous variables) of static model equations f, i.e. d(df/dys)/dys, in declaration order
|
||||||
if order < 3
|
if order < 3
|
||||||
[~, g1, g2, g3] = feval([fname,'.dynamic'], ys(I), exo_steady_state', params, ys, 1); %note that g3 does not contain symmetric elements
|
[~, g1, g2, g3] = feval([fname,'.dynamic'], ys(I), exo_steady_state', params, ys, 1); %note that g3 does not contain symmetric elements
|
||||||
g3 = identification.unfold_g3(g3, yy0ex0_nbr); %add symmetric elements to g3
|
g3 = identification.unfold_g3(g3, yy0ex0_nbr); %add symmetric elements to g3
|
||||||
|
@ -505,7 +507,7 @@ elseif (analytic_derivation_mode == 0 || analytic_derivation_mode == 1)
|
||||||
end
|
end
|
||||||
%handling of steady state for nonstationary variables
|
%handling of steady state for nonstationary variables
|
||||||
if any(any(isnan(dys)))
|
if any(any(isnan(dys)))
|
||||||
[U,T] = schur(g1_static);
|
[U,T] = schur(full(g1_static));
|
||||||
e1 = abs(ordeig(T)) < qz_criterium-1;
|
e1 = abs(ordeig(T)) < qz_criterium-1;
|
||||||
k = sum(e1); % Number of non stationary variables.
|
k = sum(e1); % Number of non stationary variables.
|
||||||
% Number of stationary variables: n = length(e1)-k
|
% Number of stationary variables: n = length(e1)-k
|
||||||
|
|
|
@ -15,7 +15,7 @@ function simulation = simul_static_model(samplesize, innovations)
|
||||||
% [2] The last input argument is not mandatory. If absent we use random draws and rescale them with the informations provided
|
% [2] The last input argument is not mandatory. If absent we use random draws and rescale them with the informations provided
|
||||||
% through the shocks block.
|
% through the shocks block.
|
||||||
|
|
||||||
% Copyright © 2019-2022 Dynare Team
|
% Copyright © 2019-2024 Dynare Team
|
||||||
%
|
%
|
||||||
% This file is part of Dynare.
|
% This file is part of Dynare.
|
||||||
%
|
%
|
||||||
|
@ -83,12 +83,17 @@ else
|
||||||
oo_.exo_simul = Innovations;
|
oo_.exo_simul = Innovations;
|
||||||
end
|
end
|
||||||
|
|
||||||
staticmodel = str2func(sprintf('%s.static', M_.fname));
|
static_resid = str2func(sprintf('%s.sparse.static_resid', M_.fname));
|
||||||
|
static_g1 = str2func(sprintf('%s.sparse.static_g1', M_.fname));
|
||||||
|
function [resid, g1] = staticmodel(y, x, params)
|
||||||
|
[resid, T_order, T] = static_resid(y, x, params);
|
||||||
|
g1 = static_g1(y, x, params, M_.static_g1_sparse_rowval, M_.static_g1_sparse_colval, M_.static_g1_sparse_colptr, T_order, T);
|
||||||
|
end
|
||||||
|
|
||||||
% Simulations (call a Newton-like algorithm for each period).
|
% Simulations (call a Newton-like algorithm for each period).
|
||||||
for t=1:samplesize
|
for t=1:samplesize
|
||||||
y = zeros(M_.endo_nbr, 1);
|
y = zeros(M_.endo_nbr, 1);
|
||||||
[oo_.endo_simul(:,t), errorflag, ~, ~, errorcode] = dynare_solve(staticmodel, y, options_.simul.maxit, options_.dynatol.f, options_.dynatol.x, options_, oo_.exo_simul(t,:), M_.params);
|
[oo_.endo_simul(:,t), errorflag, ~, ~, errorcode] = dynare_solve(@staticmodel, y, options_.simul.maxit, options_.dynatol.f, options_.dynatol.x, options_, oo_.exo_simul(t,:), M_.params);
|
||||||
if errorflag
|
if errorflag
|
||||||
dprintf('simul_static_mode: Nonlinear solver failed with errorcode=%i in period %i.', errorcode, t)
|
dprintf('simul_static_mode: Nonlinear solver failed with errorcode=%i in period %i.', errorcode, t)
|
||||||
oo_.endo_simul(:,t) = nan;
|
oo_.endo_simul(:,t) = nan;
|
||||||
|
@ -103,4 +108,6 @@ if isdseries(innovations)
|
||||||
initperiod = innovations.dates(1);
|
initperiod = innovations.dates(1);
|
||||||
end
|
end
|
||||||
|
|
||||||
simulation = [dseries(ysim', initperiod, M_.endo_names(1:M_.orig_endo_nbr)), dseries(xsim, initperiod, M_.exo_names)];
|
simulation = [dseries(ysim', initperiod, M_.endo_names(1:M_.orig_endo_nbr)), dseries(xsim, initperiod, M_.exo_names)];
|
||||||
|
|
||||||
|
end
|
||||||
|
|
|
@ -0,0 +1,58 @@
|
||||||
|
function H = build_two_dim_hessian(sparse_indices, g2_v, neq, nvar)
|
||||||
|
% Creates a 2D Hessian (equations in rows, pairs of variables in columns),
|
||||||
|
% given the output from the sparse {static,dynamic}_g2.m
|
||||||
|
%
|
||||||
|
% – sparse_indices is typically equal to M_.{static,dynamic}_g2_sparse_indices
|
||||||
|
% – g2_v is the vector of non zero values returned by {static,dynamic}_g2.m
|
||||||
|
% – neq is the number of equations (equal to number of rows of the output matrix)
|
||||||
|
% – nvar is the number of variables (the output matrix will have nvar² columns)
|
||||||
|
|
||||||
|
% Copyright © 2024 Dynare Team
|
||||||
|
%
|
||||||
|
% This file is part of Dynare.
|
||||||
|
%
|
||||||
|
% Dynare 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.
|
||||||
|
%
|
||||||
|
% Dynare is distributed in the hope that 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 Dynare. If not, see <https://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
|
nnz = size(sparse_indices, 1);
|
||||||
|
|
||||||
|
%% The g2_* arrays may be expanded if there are symmetric elements added
|
||||||
|
g2_i = int32(zeros(nnz, 1));
|
||||||
|
g2_j = int32(zeros(nnz, 1));
|
||||||
|
|
||||||
|
next_sym_idx = nnz + 1; % Index of next symmetric element to be added
|
||||||
|
|
||||||
|
for k = 1:length(g2_v)
|
||||||
|
eq = sparse_indices(k, 1);
|
||||||
|
var1 = sparse_indices(k, 2)-1;
|
||||||
|
var2 = sparse_indices(k, 3)-1;
|
||||||
|
|
||||||
|
g2_i(k) = eq;
|
||||||
|
g2_j(k) = var1 * nvar + var2 + 1;
|
||||||
|
|
||||||
|
%% Add symmetric elements, which are not included by sparse {static,dynamic}_g2.m
|
||||||
|
if var1 ~= var2
|
||||||
|
g2_i(next_sym_idx) = eq;
|
||||||
|
g2_j(next_sym_idx) = var2 * nvar + var1 + 1;
|
||||||
|
g2_v(next_sym_idx) = g2_v(k);
|
||||||
|
next_sym_idx = next_sym_idx + 1;
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
%% On MATLAB < R2020a, sparse() does not accept int32 indices
|
||||||
|
if ~isoctave && matlab_ver_less_than('9.8')
|
||||||
|
g2_i = double(g2_i);
|
||||||
|
g2_j = double(g2_j);
|
||||||
|
end
|
||||||
|
|
||||||
|
H = sparse(g2_i, g2_j, g2_v, neq, nvar*nvar);
|
|
@ -13,7 +13,7 @@ function [dr, info, params]=discretionary_policy_1(M_, options_, dr, endo_steady
|
||||||
% - info [integer] scalar or vector, error code.
|
% - info [integer] scalar or vector, error code.
|
||||||
% - params [double] vector of potentially updated parameters
|
% - params [double] vector of potentially updated parameters
|
||||||
|
|
||||||
% Copyright © 2007-2020 Dynare Team
|
% Copyright © 2007-2024 Dynare Team
|
||||||
%
|
%
|
||||||
% This file is part of Dynare.
|
% This file is part of Dynare.
|
||||||
%
|
%
|
||||||
|
@ -49,7 +49,9 @@ else
|
||||||
end
|
end
|
||||||
params=M_.params;
|
params=M_.params;
|
||||||
|
|
||||||
[~,Uy,W] = feval([M_.fname,'.objective.static'],zeros(M_.endo_nbr,1),[], M_.params);
|
y = zeros(M_.endo_nbr,1);
|
||||||
|
[Uy, T_order, T] = feval([M_.fname,'.objective.sparse.static_g1'], y, [], params, M_.objective_g1_sparse_rowval, M_.objective_g1_sparse_colval, M_.objective_g1_sparse_colptr);
|
||||||
|
|
||||||
if any(any(isnan(Uy)))
|
if any(any(isnan(Uy)))
|
||||||
info = 64 ; %the derivatives of the objective function contain NaN
|
info = 64 ; %the derivatives of the objective function contain NaN
|
||||||
return;
|
return;
|
||||||
|
@ -70,6 +72,8 @@ if any(any(Uy~=0))
|
||||||
return;
|
return;
|
||||||
end
|
end
|
||||||
|
|
||||||
|
g2_v = feval([M_.fname,'.objective.sparse.static_g2'], y, [], params, T_order, T);
|
||||||
|
W = build_two_dim_hessian(M_.objective_g2_sparse_indices, g2_v, 1, M_.endo_nbr);
|
||||||
W=reshape(W,M_.endo_nbr,M_.endo_nbr);
|
W=reshape(W,M_.endo_nbr,M_.endo_nbr);
|
||||||
|
|
||||||
klen = M_.maximum_lag + M_.maximum_lead + 1;
|
klen = M_.maximum_lag + M_.maximum_lead + 1;
|
||||||
|
@ -122,4 +126,4 @@ dr.ghu=G(dr.order_var,:);
|
||||||
if M_.maximum_endo_lag
|
if M_.maximum_endo_lag
|
||||||
Selection=M_.lead_lag_incidence(1,dr.order_var)>0;%select state variables
|
Selection=M_.lead_lag_incidence(1,dr.order_var)>0;%select state variables
|
||||||
end
|
end
|
||||||
dr.ghx=T(:,Selection);
|
dr.ghx=T(:,Selection);
|
||||||
|
|
|
@ -26,7 +26,7 @@ function SampleAddress = selec_posterior_draws(M_,options_,dr,endo_steady_state,
|
||||||
% None.
|
% None.
|
||||||
%
|
%
|
||||||
|
|
||||||
% Copyright © 2006-2022 Dynare Team
|
% Copyright © 2006-2024 Dynare Team
|
||||||
%
|
%
|
||||||
% This file is part of Dynare.
|
% This file is part of Dynare.
|
||||||
%
|
%
|
||||||
|
@ -146,7 +146,7 @@ if info
|
||||||
pdraws(linee,1) = {x2(SampleAddress(i,4),:)};
|
pdraws(linee,1) = {x2(SampleAddress(i,4),:)};
|
||||||
if info==2
|
if info==2
|
||||||
M_ = set_parameters_locally(M_,pdraws{i,1});
|
M_ = set_parameters_locally(M_,pdraws{i,1});
|
||||||
[dr,~,M_.params] = compute_decision_rules(M_,options_,oo_.dr, oo_.steady_state, oo_.exo_steady_state, oo_.exo_det_steady_state);
|
[dr,~,M_.params] = compute_decision_rules(M_,options_,dr, endo_steady_state, exo_steady_state, exo_det_steady_state);
|
||||||
pdraws(linee,2) = { dr };
|
pdraws(linee,2) = { dr };
|
||||||
end
|
end
|
||||||
old_mhfile = mhfile;
|
old_mhfile = mhfile;
|
||||||
|
|
|
@ -59,7 +59,7 @@ function planner_objective_value = evaluate_planner_objective(M_,options_,oo_)
|
||||||
|
|
||||||
% In the deterministic case, resorting to approximations for welfare is no longer required as it is possible to simulate the model given initial conditions for pre-determined variables and terminal conditions for forward-looking variables, whether these initial and terminal conditions are explicitly or implicitly specified. Assuming that the number of simulated periods is high enough for the new steady-state to be reached, the new unconditional welfare is thus the last period's welfare. As for the conditional welfare, it can be derived using backward recursions on the equation W = U + beta*W(+1) starting from the final unconditional steady-state welfare.
|
% In the deterministic case, resorting to approximations for welfare is no longer required as it is possible to simulate the model given initial conditions for pre-determined variables and terminal conditions for forward-looking variables, whether these initial and terminal conditions are explicitly or implicitly specified. Assuming that the number of simulated periods is high enough for the new steady-state to be reached, the new unconditional welfare is thus the last period's welfare. As for the conditional welfare, it can be derived using backward recursions on the equation W = U + beta*W(+1) starting from the final unconditional steady-state welfare.
|
||||||
|
|
||||||
% Copyright © 2007-2022 Dynare Team
|
% Copyright © 2007-2024 Dynare Team
|
||||||
%
|
%
|
||||||
% This file is part of Dynare.
|
% This file is part of Dynare.
|
||||||
%
|
%
|
||||||
|
@ -92,11 +92,11 @@ end
|
||||||
|
|
||||||
if options_.ramsey_policy && oo_.gui.ran_perfect_foresight
|
if options_.ramsey_policy && oo_.gui.ran_perfect_foresight
|
||||||
T = size(oo_.endo_simul,2);
|
T = size(oo_.endo_simul,2);
|
||||||
[U_term] = feval([M_.fname '.objective.static'],oo_.endo_simul(:,T-M_.maximum_lead),oo_.exo_simul(T-M_.maximum_lead,:), M_.params);
|
U_term = feval([M_.fname '.objective.sparse.static_resid'], oo_.endo_simul(:,T-M_.maximum_lead), oo_.exo_simul(T-M_.maximum_lead,:), M_.params);
|
||||||
EW = U_term/(1-beta);
|
EW = U_term/(1-beta);
|
||||||
W = EW;
|
W = EW;
|
||||||
for t=T-M_.maximum_lead:-1:1+M_.maximum_lag
|
for t=T-M_.maximum_lead:-1:1+M_.maximum_lag
|
||||||
[U] = feval([M_.fname '.objective.static'],oo_.endo_simul(:,t),oo_.exo_simul(t,:), M_.params);
|
U = feval([M_.fname '.objective.sparse.static_resid'], oo_.endo_simul(:,t), oo_.exo_simul(t,:), M_.params);
|
||||||
W = U + beta*W;
|
W = U + beta*W;
|
||||||
end
|
end
|
||||||
planner_objective_value = struct('conditional', W, 'unconditional', EW);
|
planner_objective_value = struct('conditional', W, 'unconditional', EW);
|
||||||
|
@ -108,7 +108,8 @@ else
|
||||||
ys = oo_.dr.ys;
|
ys = oo_.dr.ys;
|
||||||
end
|
end
|
||||||
if options_.order == 1 && ~options_.discretionary_policy
|
if options_.order == 1 && ~options_.discretionary_policy
|
||||||
[U,Uy] = feval([M_.fname '.objective.static'],ys,zeros(1,exo_nbr), M_.params);
|
[U, T_order, T] = feval([M_.fname '.objective.sparse.static_resid'], ys, zeros(1,exo_nbr), M_.params);
|
||||||
|
Uy = feval([M_.fname '.objective.sparse.static_g1'], ys, zeros(1,exo_nbr), M_.params, M_.objective_g1_sparse_rowval, M_.objective_g1_sparse_colval, M_.objective_g1_sparse_colptr, T_order, T);
|
||||||
|
|
||||||
Gy = dr.ghx(nstatic+(1:nspred),:);
|
Gy = dr.ghx(nstatic+(1:nspred),:);
|
||||||
Gu = dr.ghu(nstatic+(1:nspred),:);
|
Gu = dr.ghu(nstatic+(1:nspred),:);
|
||||||
|
@ -137,7 +138,9 @@ else
|
||||||
planner_objective_value.conditional.zero_initial_multiplier = W_L_0;
|
planner_objective_value.conditional.zero_initial_multiplier = W_L_0;
|
||||||
|
|
||||||
elseif options_.order == 2 && ~M_.hessian_eq_zero %full second order approximation
|
elseif options_.order == 2 && ~M_.hessian_eq_zero %full second order approximation
|
||||||
[U,Uy,Uyy] = feval([M_.fname '.objective.static'],ys,zeros(1,exo_nbr), M_.params);
|
[U, T_order, T] = feval([M_.fname '.objective.sparse.static_resid'], ys, zeros(1,exo_nbr), M_.params);
|
||||||
|
[Uy, T_order, T] = feval([M_.fname '.objective.sparse.static_g1'], ys, zeros(1,exo_nbr), M_.params, M_.objective_g1_sparse_rowval, M_.objective_g1_sparse_colval, M_.objective_g1_sparse_colptr, T_order, T);
|
||||||
|
Uyy_v = feval([M_.fname '.objective.sparse.static_g2'], ys, zeros(1,exo_nbr), M_.params, T_order, T);
|
||||||
|
|
||||||
Gy = dr.ghx(nstatic+(1:nspred),:);
|
Gy = dr.ghx(nstatic+(1:nspred),:);
|
||||||
Gu = dr.ghu(nstatic+(1:nspred),:);
|
Gu = dr.ghu(nstatic+(1:nspred),:);
|
||||||
|
@ -153,6 +156,7 @@ else
|
||||||
guu(dr.order_var,:) = dr.ghuu;
|
guu(dr.order_var,:) = dr.ghuu;
|
||||||
gss(dr.order_var,:) = dr.ghs2;
|
gss(dr.order_var,:) = dr.ghs2;
|
||||||
|
|
||||||
|
Uyy = build_two_dim_hessian(M_.objective_g2_sparse_indices, Uyy_v, 1, M_.endo_nbr);
|
||||||
Uyy = full(Uyy);
|
Uyy = full(Uyy);
|
||||||
|
|
||||||
Uyygygy = A_times_B_kronecker_C(Uyy,gy,gy);
|
Uyygygy = A_times_B_kronecker_C(Uyy,gy,gy);
|
||||||
|
@ -228,13 +232,16 @@ else
|
||||||
planner_objective_value.conditional.steady_initial_multiplier = W_L_SS;
|
planner_objective_value.conditional.steady_initial_multiplier = W_L_SS;
|
||||||
planner_objective_value.conditional.zero_initial_multiplier = W_L_0;
|
planner_objective_value.conditional.zero_initial_multiplier = W_L_0;
|
||||||
elseif (options_.order == 2 && M_.hessian_eq_zero) || options_.discretionary_policy %linear quadratic problem
|
elseif (options_.order == 2 && M_.hessian_eq_zero) || options_.discretionary_policy %linear quadratic problem
|
||||||
[U,Uy,Uyy] = feval([M_.fname '.objective.static'],ys,zeros(1,exo_nbr), M_.params);
|
[U, T_order, T] = feval([M_.fname '.objective.sparse.static_resid'], ys, zeros(1,exo_nbr), M_.params);
|
||||||
|
[Uy, T_order, T] = feval([M_.fname '.objective.sparse.static_g1'], ys, zeros(1,exo_nbr), M_.params, M_.objective_g1_sparse_rowval, M_.objective_g1_sparse_colval, M_.objective_g1_sparse_colptr, T_order, T);
|
||||||
|
Uyy_v = feval([M_.fname '.objective.sparse.static_g2'], ys, zeros(1,exo_nbr), M_.params, T_order, T);
|
||||||
|
|
||||||
Gy = dr.ghx(nstatic+(1:nspred),:);
|
Gy = dr.ghx(nstatic+(1:nspred),:);
|
||||||
Gu = dr.ghu(nstatic+(1:nspred),:);
|
Gu = dr.ghu(nstatic+(1:nspred),:);
|
||||||
gy(dr.order_var,:) = dr.ghx;
|
gy(dr.order_var,:) = dr.ghx;
|
||||||
gu(dr.order_var,:) = dr.ghu;
|
gu(dr.order_var,:) = dr.ghu;
|
||||||
|
|
||||||
|
Uyy = build_two_dim_hessian(M_.objective_g2_sparse_indices, Uyy_v, 1, M_.endo_nbr);
|
||||||
Uyy = full(Uyy);
|
Uyy = full(Uyy);
|
||||||
|
|
||||||
Uyygygy = A_times_B_kronecker_C(Uyy,gy,gy);
|
Uyygygy = A_times_B_kronecker_C(Uyy,gy,gy);
|
||||||
|
@ -305,7 +312,7 @@ else
|
||||||
dr.(['g_' num2str(i)]) = [dr.(['g_' num2str(i)]); W.(['W_' num2str(i)])];
|
dr.(['g_' num2str(i)]) = [dr.(['g_' num2str(i)]); W.(['W_' num2str(i)])];
|
||||||
end
|
end
|
||||||
% Amends the steady-state vector accordingly
|
% Amends the steady-state vector accordingly
|
||||||
[U] = feval([M_.fname '.objective.static'],ys,zeros(1,exo_nbr), M_.params);
|
U = feval([M_.fname '.objective.sparse.static_resid'], ys, zeros(1,exo_nbr), M_.params);
|
||||||
ysteady = [ys(oo_.dr.order_var); U/(1-beta)];
|
ysteady = [ys(oo_.dr.order_var); U/(1-beta)];
|
||||||
|
|
||||||
% Generates the sequence of shocks to compute unconditional welfare
|
% Generates the sequence of shocks to compute unconditional welfare
|
||||||
|
|
|
@ -123,7 +123,11 @@ for its = 1:maxit
|
||||||
fjac2=fjac'*fjac;
|
fjac2=fjac'*fjac;
|
||||||
temp=max(sum(abs(fjac2)));
|
temp=max(sum(abs(fjac2)));
|
||||||
if temp>0
|
if temp>0
|
||||||
p=-(fjac2+sqrt(nn*eps)*temp*eye(nn))\(fjac'*fvec);
|
if issparse(fjac)
|
||||||
|
p=-(fjac2+sqrt(nn*eps)*temp*speye(nn))\(fjac'*fvec);
|
||||||
|
else
|
||||||
|
p=-(fjac2+sqrt(nn*eps)*temp*eye(nn))\(fjac'*fvec);
|
||||||
|
end
|
||||||
else
|
else
|
||||||
errorflag = true;
|
errorflag = true;
|
||||||
errorcode = 5;
|
errorcode = 5;
|
||||||
|
|
|
@ -25,7 +25,7 @@ function [dr,info]=PCL_resol(ys,check_flag)
|
||||||
% SPECIAL REQUIREMENTS
|
% SPECIAL REQUIREMENTS
|
||||||
% none
|
% none
|
||||||
|
|
||||||
% Copyright © 2001-2017 Dynare Team
|
% Copyright © 2001-2024 Dynare Team
|
||||||
%
|
%
|
||||||
% This file is part of Dynare.
|
% This file is part of Dynare.
|
||||||
%
|
%
|
||||||
|
@ -65,7 +65,13 @@ end
|
||||||
dr.ys = ys;
|
dr.ys = ys;
|
||||||
check1 = 0;
|
check1 = 0;
|
||||||
% testing for steadystate file
|
% testing for steadystate file
|
||||||
fh = str2func([M_.fname '.static']);
|
static_resid = str2func(sprintf('%s.sparse.static_resid', M_.fname));
|
||||||
|
static_g1 = str2func(sprintf('%s.sparse.static_g1', M_.fname));
|
||||||
|
function [resid, g1] = static_resid_g1(y, x, params)
|
||||||
|
[resid, T_order, T] = static_resid(y, x, params);
|
||||||
|
g1 = static_g1(y, x, params, M_.static_g1_sparse_rowval, M_.static_g1_sparse_colval, M_.static_g1_sparse_colptr, T_order, T);
|
||||||
|
end
|
||||||
|
|
||||||
if options_.steadystate_flag
|
if options_.steadystate_flag
|
||||||
[dr.ys,check1] = feval([M_.fname '_steadystate'],dr.ys,...
|
[dr.ys,check1] = feval([M_.fname '_steadystate'],dr.ys,...
|
||||||
[oo_.exo_steady_state; ...
|
[oo_.exo_steady_state; ...
|
||||||
|
@ -87,17 +93,17 @@ else
|
||||||
if ~options_.ramsey_policy
|
if ~options_.ramsey_policy
|
||||||
if options_.linear == 0
|
if options_.linear == 0
|
||||||
% nonlinear models
|
% nonlinear models
|
||||||
if max(abs(feval(fh,dr.ys,[oo_.exo_steady_state; ...
|
if max(abs(static_resid_g1(dr.ys, [oo_.exo_steady_state; ...
|
||||||
oo_.exo_det_steady_state], M_.params))) > options_.solve_tolf
|
oo_.exo_det_steady_state], M_.params))) > options_.solve_tolf
|
||||||
opt = options_;
|
opt = options_;
|
||||||
opt.jacobian_flag = false;
|
opt.jacobian_flag = false;
|
||||||
[dr.ys, check1] = dynare_solve(fh,dr.ys, options.steady_.maxit, options_.solve_tolf, options_.solve_tolx, ...
|
[dr.ys, check1] = dynare_solve(static_resid_g1, dr.ys, options.steady_.maxit, options_.solve_tolf, options_.solve_tolx, ...
|
||||||
opt, [oo_.exo_steady_state; oo_.exo_det_steady_state], M_.params);
|
opt, [oo_.exo_steady_state; oo_.exo_det_steady_state], M_.params);
|
||||||
end
|
end
|
||||||
else
|
else
|
||||||
% linear models
|
% linear models
|
||||||
[fvec,jacob] = feval(fh,dr.ys,[oo_.exo_steady_state;...
|
[fvec,jacob] = static_resid_g1(dr.ys, [oo_.exo_steady_state;...
|
||||||
oo_.exo_det_steady_state], M_.params);
|
oo_.exo_det_steady_state], M_.params);
|
||||||
if max(abs(fvec)) > 1e-12
|
if max(abs(fvec)) > 1e-12
|
||||||
dr.ys = dr.ys-jacob\fvec;
|
dr.ys = dr.ys-jacob\fvec;
|
||||||
end
|
end
|
||||||
|
@ -111,7 +117,7 @@ if check1
|
||||||
resid = check1 ;
|
resid = check1 ;
|
||||||
else
|
else
|
||||||
info(1)= 20;
|
info(1)= 20;
|
||||||
resid = feval(fh,ys,oo_.exo_steady_state, M_.params);
|
resid = static_resid(ys, oo_.exo_steady_state, M_.params);
|
||||||
end
|
end
|
||||||
info(2) = resid'*resid ;
|
info(2) = resid'*resid ;
|
||||||
return
|
return
|
||||||
|
@ -140,6 +146,8 @@ end
|
||||||
oo_.exo_simul = tempex;
|
oo_.exo_simul = tempex;
|
||||||
tempex = [];
|
tempex = [];
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
% 01/01/2003 MJ added dr_algo == 1
|
% 01/01/2003 MJ added dr_algo == 1
|
||||||
% 08/24/2001 MJ uses Schmitt-Grohe and Uribe (2001) constant correction
|
% 08/24/2001 MJ uses Schmitt-Grohe and Uribe (2001) constant correction
|
||||||
% in dr.ghs2
|
% in dr.ghs2
|
||||||
|
|
|
@ -2,7 +2,7 @@ function ys1 = add_auxiliary_variables_to_steadystate(ys,aux_vars,fname, ...
|
||||||
exo_steady_state, exo_det_steady_state,params, byte_code)
|
exo_steady_state, exo_det_steady_state,params, byte_code)
|
||||||
% Add auxiliary variables to the steady state vector
|
% Add auxiliary variables to the steady state vector
|
||||||
|
|
||||||
% Copyright © 2009-2023 Dynare Team
|
% Copyright © 2009-2024 Dynare Team
|
||||||
%
|
%
|
||||||
% This file is part of Dynare.
|
% This file is part of Dynare.
|
||||||
%
|
%
|
||||||
|
@ -30,7 +30,7 @@ for i=1:n+1
|
||||||
[exo_steady_state; ...
|
[exo_steady_state; ...
|
||||||
exo_det_steady_state],params);
|
exo_det_steady_state],params);
|
||||||
else
|
else
|
||||||
res = feval([fname '.static'],ys1,...
|
res = feval([fname '.sparse.static_resid'], ys1,...
|
||||||
[exo_steady_state; ...
|
[exo_steady_state; ...
|
||||||
exo_det_steady_state],params);
|
exo_det_steady_state],params);
|
||||||
end
|
end
|
||||||
|
|
|
@ -23,7 +23,7 @@ function [oo_, ts]=perfect_foresight_solver(M_, options_, oo_, no_error_if_learn
|
||||||
% SPECIAL REQUIREMENTS
|
% SPECIAL REQUIREMENTS
|
||||||
% none
|
% none
|
||||||
|
|
||||||
% Copyright © 1996-2023 Dynare Team
|
% Copyright © 1996-2024 Dynare Team
|
||||||
%
|
%
|
||||||
% This file is part of Dynare.
|
% This file is part of Dynare.
|
||||||
%
|
%
|
||||||
|
@ -55,7 +55,7 @@ end
|
||||||
periods = options_.periods;
|
periods = options_.periods;
|
||||||
|
|
||||||
if options_.debug
|
if options_.debug
|
||||||
model_static = str2func([M_.fname,'.static']);
|
model_static = str2func([M_.fname,'.sparse.static_resid']);
|
||||||
for ii=1:size(oo_.exo_simul,1)
|
for ii=1:size(oo_.exo_simul,1)
|
||||||
[residual(:,ii)] = model_static(oo_.steady_state, oo_.exo_simul(ii,:),M_.params);
|
[residual(:,ii)] = model_static(oo_.steady_state, oo_.exo_simul(ii,:),M_.params);
|
||||||
end
|
end
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright © 2021-2023 Dynare Team
|
* Copyright © 2021-2024 Dynare Team
|
||||||
*
|
*
|
||||||
* This file is part of Dynare.
|
* This file is part of Dynare.
|
||||||
*
|
*
|
||||||
|
@ -18,26 +18,23 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "k_ord_objective.hh"
|
#include "k_ord_objective.hh"
|
||||||
#include "objective_abstract_class.hh"
|
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
KordwDynare::KordwDynare(KordpDynare& m, ConstVector& NNZD_arg, Journal& jr, Vector& inParams,
|
KordwDynare::KordwDynare(KordpDynare& m, Journal& jr, Vector& inParams,
|
||||||
std::unique_ptr<ObjectiveAC> objectiveFile_arg,
|
std::unique_ptr<ObjectiveMFile> objectiveFile_arg,
|
||||||
const std::vector<int>& dr_order) :
|
const std::vector<int>& dr_order) :
|
||||||
model {m},
|
model {m},
|
||||||
NNZD {NNZD_arg},
|
|
||||||
journal {jr},
|
journal {jr},
|
||||||
params {inParams},
|
params {inParams},
|
||||||
resid(1),
|
resid(1),
|
||||||
ud {1},
|
ud {1},
|
||||||
objectiveFile {std::move(objectiveFile_arg)}
|
objectiveFile {std::move(objectiveFile_arg)}
|
||||||
{
|
{
|
||||||
dynppToDyn = dr_order;
|
|
||||||
dynToDynpp.resize(model.ny());
|
dynToDynpp.resize(model.ny());
|
||||||
for (int i = 0; i < model.ny(); i++)
|
for (int i = 0; i < model.ny(); i++)
|
||||||
dynToDynpp[dynppToDyn[i]] = i;
|
dynToDynpp[dr_order[i]] = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
@ -46,71 +43,10 @@ KordwDynare::calcDerivativesAtSteady()
|
||||||
|
|
||||||
assert(ud.begin() == ud.end());
|
assert(ud.begin() == ud.end());
|
||||||
|
|
||||||
std::vector<TwoDMatrix> dyn_ud; // Planner's objective derivatives, in Dynare form
|
|
||||||
dyn_ud.emplace_back(1, model.ny()); // Allocate Jacobian
|
|
||||||
dyn_ud.back().zeros();
|
|
||||||
|
|
||||||
for (int i = 2; i <= model.order(); i++)
|
|
||||||
{
|
|
||||||
// Higher order derivatives, as sparse (3-column) matrices
|
|
||||||
dyn_ud.emplace_back(static_cast<int>(NNZD[i - 1]), 3);
|
|
||||||
dyn_ud.back().zeros();
|
|
||||||
}
|
|
||||||
|
|
||||||
Vector xx(model.nexog());
|
Vector xx(model.nexog());
|
||||||
xx.zeros();
|
xx.zeros();
|
||||||
resid.zeros();
|
resid.zeros();
|
||||||
objectiveFile->eval(model.getSteady(), xx, params, resid, dyn_ud);
|
objectiveFile->eval(model.getSteady(), xx, params, resid, dynToDynpp, ud);
|
||||||
|
|
||||||
for (int i = 1; i <= model.order(); i++)
|
|
||||||
populateDerivativesContainer(dyn_ud, i);
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
|
||||||
KordwDynare::populateDerivativesContainer(const std::vector<TwoDMatrix>& dyn_ud, int ord)
|
|
||||||
{
|
|
||||||
const TwoDMatrix& u = dyn_ud[ord - 1];
|
|
||||||
|
|
||||||
// utility derivatives FSSparseTensor instance
|
|
||||||
auto udTi = std::make_unique<FSSparseTensor>(ord, model.ny(), 1);
|
|
||||||
|
|
||||||
IntSequence s(ord, 0);
|
|
||||||
|
|
||||||
if (ord == 1)
|
|
||||||
for (int i = 0; i < u.ncols(); i++)
|
|
||||||
{
|
|
||||||
for (int j = 0; j < u.nrows(); j++)
|
|
||||||
{
|
|
||||||
double x = u.get(j, dynppToDyn[s[0]]);
|
|
||||||
if (x != 0.0)
|
|
||||||
udTi->insert(s, j, x);
|
|
||||||
}
|
|
||||||
s[0]++;
|
|
||||||
}
|
|
||||||
else // ord ≥ 2
|
|
||||||
for (int i = 0; i < u.nrows(); i++)
|
|
||||||
{
|
|
||||||
int j = static_cast<int>(u.get(i, 0)) - 1;
|
|
||||||
int i1 = static_cast<int>(u.get(i, 1)) - 1;
|
|
||||||
if (j < 0 || i1 < 0)
|
|
||||||
continue; // Discard empty entries (see comment in DynamicModelAC::unpackSparseMatrix())
|
|
||||||
|
|
||||||
for (int k = 0; k < ord; k++)
|
|
||||||
{
|
|
||||||
s[k] = dynToDynpp[i1 % model.ny()];
|
|
||||||
i1 /= model.ny();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ord == 2 && !s.isSorted())
|
|
||||||
continue; // Skip symmetric elements (only needed at order 2)
|
|
||||||
else if (ord > 2)
|
|
||||||
s.sort(); // For higher order, canonicalize the multi-index
|
|
||||||
|
|
||||||
double x = u.get(i, 2);
|
|
||||||
udTi->insert(s, j, x);
|
|
||||||
}
|
|
||||||
|
|
||||||
ud.insert(std::move(udTi));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright © 2021-2023 Dynare Team
|
* Copyright © 2021-2024 Dynare Team
|
||||||
*
|
*
|
||||||
* This file is part of Dynare.
|
* This file is part of Dynare.
|
||||||
*
|
*
|
||||||
|
@ -21,7 +21,7 @@
|
||||||
#define K_ORD_OBJECTIVE_HH
|
#define K_ORD_OBJECTIVE_HH
|
||||||
|
|
||||||
#include "k_ord_dynare.hh"
|
#include "k_ord_dynare.hh"
|
||||||
#include "objective_abstract_class.hh"
|
#include "objective_m.hh"
|
||||||
|
|
||||||
class KordwDynare;
|
class KordwDynare;
|
||||||
|
|
||||||
|
@ -29,22 +29,19 @@ class KordwDynare
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
KordpDynare& model;
|
KordpDynare& model;
|
||||||
const ConstVector& NNZD;
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Journal& journal;
|
Journal& journal;
|
||||||
Vector& params;
|
Vector& params;
|
||||||
Vector resid;
|
Vector resid;
|
||||||
TensorContainer<FSSparseTensor> ud; // planner's objective derivatives, in Dynare++ form
|
TensorContainer<FSSparseTensor> ud; // planner's objective derivatives, in Dynare++ form
|
||||||
std::vector<int> dynppToDyn; // Maps Dynare++ jacobian variable indices to Dynare ones
|
|
||||||
std::vector<int> dynToDynpp; // Maps Dynare jacobian variable indices to Dynare++ ones
|
std::vector<int> dynToDynpp; // Maps Dynare jacobian variable indices to Dynare++ ones
|
||||||
std::unique_ptr<ObjectiveAC> objectiveFile;
|
std::unique_ptr<ObjectiveMFile> objectiveFile;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
KordwDynare(KordpDynare& m, ConstVector& NNZD_arg, Journal& jr, Vector& inParams,
|
KordwDynare(KordpDynare& m, Journal& jr, Vector& inParams,
|
||||||
std::unique_ptr<ObjectiveAC> objectiveFile_arg, const std::vector<int>& varOrder);
|
std::unique_ptr<ObjectiveMFile> objectiveFile_arg, const std::vector<int>& varOrder);
|
||||||
void calcDerivativesAtSteady();
|
void calcDerivativesAtSteady();
|
||||||
void populateDerivativesContainer(const std::vector<TwoDMatrix>& dyn_ud, int ord);
|
|
||||||
[[nodiscard]] const TensorContainer<FSSparseTensor>&
|
[[nodiscard]] const TensorContainer<FSSparseTensor>&
|
||||||
getPlannerObjDerivatives() const
|
getPlannerObjDerivatives() const
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright © 2021-2022 Dynare Team
|
* Copyright © 2021-2024 Dynare Team
|
||||||
*
|
*
|
||||||
* This file is part of Dynare.
|
* This file is part of Dynare.
|
||||||
*
|
*
|
||||||
|
@ -31,6 +31,7 @@
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
|
#include <string>
|
||||||
|
|
||||||
#include "dynmex.h"
|
#include "dynmex.h"
|
||||||
|
|
||||||
|
@ -87,8 +88,8 @@ The routine proceeds in several steps:
|
||||||
to the approxAtSteady method in the ApproximationWelfare class carries out the necessary
|
to the approxAtSteady method in the ApproximationWelfare class carries out the necessary
|
||||||
operation
|
operation
|
||||||
- Importing the derivatives of the felicity function with the calcDerivativesAtSteady() method of
|
- Importing the derivatives of the felicity function with the calcDerivativesAtSteady() method of
|
||||||
the KordwDynare class. It relies on the Matlab-generated files, which are handled by the
|
the KordwDynare class. It relies on the MATLAB-generated files, which are handled by the
|
||||||
ObjectiveAC and ObjectiveMFile classes
|
ObjectiveMFile class
|
||||||
- Pinpointing the derivatives of the felicity and welfare functions. The performStep method of
|
- Pinpointing the derivatives of the felicity and welfare functions. The performStep method of
|
||||||
the KOrderWelfare class carries out the calculations,resorting to the FaaDiBruno class and its
|
the KOrderWelfare class carries out the calculations,resorting to the FaaDiBruno class and its
|
||||||
methods to get the needed intermediary results.
|
methods to get the needed intermediary results.
|
||||||
|
@ -214,15 +215,6 @@ extern "C"
|
||||||
mexErrMsgTxt("The derivatives were not computed for the required order. Make sure that you "
|
mexErrMsgTxt("The derivatives were not computed for the required order. Make sure that you "
|
||||||
"used the right order option inside the `stoch_simul' command");
|
"used the right order option inside the `stoch_simul' command");
|
||||||
|
|
||||||
const mxArray* nnzderivatives_obj_mx = mxGetField(M_mx, 0, "NNZDerivatives_objective");
|
|
||||||
if (!(nnzderivatives_obj_mx && mxIsDouble(nnzderivatives_obj_mx)
|
|
||||||
&& !mxIsComplex(nnzderivatives_obj_mx) && !mxIsSparse(nnzderivatives_obj_mx)))
|
|
||||||
mexErrMsgTxt("M_.NNZDerivatives should be a real dense array");
|
|
||||||
ConstVector NNZD_obj {nnzderivatives_obj_mx};
|
|
||||||
if (NNZD.length() < kOrder || NNZD_obj[kOrder - 1] == -1)
|
|
||||||
mexErrMsgTxt("The derivatives were not computed for the required order. Make sure that you "
|
|
||||||
"used the right order option inside the `stoch_simul' command");
|
|
||||||
|
|
||||||
const mxArray* endo_names_mx = mxGetField(M_mx, 0, "endo_names");
|
const mxArray* endo_names_mx = mxGetField(M_mx, 0, "endo_names");
|
||||||
if (!(endo_names_mx && mxIsCell(endo_names_mx)
|
if (!(endo_names_mx && mxIsCell(endo_names_mx)
|
||||||
&& mxGetNumberOfElements(endo_names_mx) == static_cast<size_t>(nEndo)))
|
&& mxGetNumberOfElements(endo_names_mx) == static_cast<size_t>(nEndo)))
|
||||||
|
@ -261,6 +253,32 @@ extern "C"
|
||||||
std::transform(mxGetPr(order_var_mx), mxGetPr(order_var_mx) + nEndo, dr_order.begin(),
|
std::transform(mxGetPr(order_var_mx), mxGetPr(order_var_mx) + nEndo, dr_order.begin(),
|
||||||
[](double x) { return static_cast<int>(x) - 1; });
|
[](double x) { return static_cast<int>(x) - 1; });
|
||||||
|
|
||||||
|
const mxArray* objective_g1_sparse_rowval_mx
|
||||||
|
= mxGetField(M_mx, 0, "objective_g1_sparse_rowval");
|
||||||
|
if (!(objective_g1_sparse_rowval_mx && mxIsInt32(objective_g1_sparse_rowval_mx)))
|
||||||
|
mexErrMsgTxt("M_.objective_g1_sparse_rowval should be an int32 array");
|
||||||
|
|
||||||
|
const mxArray* objective_g1_sparse_colval_mx
|
||||||
|
= mxGetField(M_mx, 0, "objective_g1_sparse_colval");
|
||||||
|
if (!(objective_g1_sparse_colval_mx && mxIsInt32(objective_g1_sparse_colval_mx)))
|
||||||
|
mexErrMsgTxt("M_.objective_g1_sparse_colval should be an int32 array");
|
||||||
|
|
||||||
|
const mxArray* objective_g1_sparse_colptr_mx
|
||||||
|
= mxGetField(M_mx, 0, "objective_g1_sparse_colptr");
|
||||||
|
if (!(objective_g1_sparse_colptr_mx && mxIsInt32(objective_g1_sparse_colptr_mx)))
|
||||||
|
mexErrMsgTxt("M_.objective_g1_sparse_colptr should be an int32 array");
|
||||||
|
|
||||||
|
std::vector<const mxArray*> objective_gN_sparse_indices;
|
||||||
|
for (int o {2}; o <= kOrder; o++)
|
||||||
|
{
|
||||||
|
using namespace std::string_literals;
|
||||||
|
auto fieldname {"objective_g"s + std::to_string(o) + "_sparse_indices"};
|
||||||
|
const mxArray* indices = mxGetField(M_mx, 0, fieldname.c_str());
|
||||||
|
if (!(indices && mxIsInt32(indices)))
|
||||||
|
mexErrMsgTxt(("M_."s + fieldname + " should be an int32 array").c_str());
|
||||||
|
objective_gN_sparse_indices.push_back(indices);
|
||||||
|
}
|
||||||
|
|
||||||
const int nSteps
|
const int nSteps
|
||||||
= 0; // Dynare++ solving steps, for time being default to 0 = deterministic steady state
|
= 0; // Dynare++ solving steps, for time being default to 0 = deterministic steady state
|
||||||
|
|
||||||
|
@ -291,21 +309,14 @@ extern "C"
|
||||||
// run stochastic steady
|
// run stochastic steady
|
||||||
app.walkStochSteady();
|
app.walkStochSteady();
|
||||||
|
|
||||||
const mxArray* objective_tmp_nbr_mx = mxGetField(M_mx, 0, "objective_tmp_nbr");
|
|
||||||
if (!(objective_tmp_nbr_mx && mxIsDouble(objective_tmp_nbr_mx)
|
|
||||||
&& !mxIsComplex(objective_tmp_nbr_mx) && !mxIsSparse(objective_tmp_nbr_mx)
|
|
||||||
&& mxGetNumberOfElements(objective_tmp_nbr_mx) >= static_cast<size_t>(kOrder + 1)))
|
|
||||||
mexErrMsgTxt("M_.objective_tmp_nbr should be a real dense array with strictly more elements "
|
|
||||||
"than the order of derivation");
|
|
||||||
int ntt_objective = std::accumulate(mxGetPr(objective_tmp_nbr_mx),
|
|
||||||
mxGetPr(objective_tmp_nbr_mx) + kOrder + 1, 0);
|
|
||||||
|
|
||||||
// Getting derivatives of the planner's objective function
|
// Getting derivatives of the planner's objective function
|
||||||
std::unique_ptr<ObjectiveAC> objectiveFile;
|
std::unique_ptr<ObjectiveMFile> objectiveFile;
|
||||||
objectiveFile = std::make_unique<ObjectiveMFile>(fname, ntt_objective);
|
objectiveFile = std::make_unique<ObjectiveMFile>(
|
||||||
|
fname, kOrder, objective_g1_sparse_rowval_mx, objective_g1_sparse_colval_mx,
|
||||||
|
objective_g1_sparse_colptr_mx, objective_gN_sparse_indices);
|
||||||
|
|
||||||
// make KordwDynare object
|
// make KordwDynare object
|
||||||
KordwDynare welfare(dynare, NNZD_obj, journal, modParams, std::move(objectiveFile), dr_order);
|
KordwDynare welfare(dynare, journal, modParams, std::move(objectiveFile), dr_order);
|
||||||
|
|
||||||
// construct main K-order approximation class of welfare
|
// construct main K-order approximation class of welfare
|
||||||
ApproximationWelfare appwel(welfare, discount_factor, app.get_rule_ders(),
|
ApproximationWelfare appwel(welfare, discount_factor, app.get_rule_ders(),
|
||||||
|
|
|
@ -1,38 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright © 2021-2023 Dynare Team
|
|
||||||
*
|
|
||||||
* This file is part of Dynare.
|
|
||||||
*
|
|
||||||
* Dynare 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.
|
|
||||||
*
|
|
||||||
* Dynare is distributed in the hope that 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 Dynare. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef OBJECTIVE_ABSTRACT_CLASS_HH
|
|
||||||
#define OBJECTIVE_ABSTRACT_CLASS_HH
|
|
||||||
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "twod_matrix.hh"
|
|
||||||
|
|
||||||
class ObjectiveAC
|
|
||||||
{
|
|
||||||
protected:
|
|
||||||
int ntt; // Size of vector of temporary terms
|
|
||||||
public:
|
|
||||||
ObjectiveAC(int ntt_arg) : ntt {ntt_arg} {};
|
|
||||||
virtual ~ObjectiveAC() = default;
|
|
||||||
virtual void eval(const Vector& y, const Vector& x, const Vector& params, Vector& residual,
|
|
||||||
std::vector<TwoDMatrix>& md)
|
|
||||||
= 0;
|
|
||||||
};
|
|
||||||
#endif
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright © 2021-2023 Dynare Team
|
* Copyright © 2021-2024 Dynare Team
|
||||||
*
|
*
|
||||||
* This file is part of Dynare.
|
* This file is part of Dynare.
|
||||||
*
|
*
|
||||||
|
@ -26,88 +26,41 @@
|
||||||
|
|
||||||
#include "objective_m.hh"
|
#include "objective_m.hh"
|
||||||
|
|
||||||
ObjectiveMFile::ObjectiveMFile(const std::string& modName, int ntt_arg) :
|
ObjectiveMFile::ObjectiveMFile(const std::string& modName, int kOrder_arg,
|
||||||
ObjectiveAC(ntt_arg), ObjectiveMFilename {modName + ".objective.static"}
|
const mxArray* objective_g1_sparse_rowval_mx_arg,
|
||||||
|
const mxArray* objective_g1_sparse_colval_mx_arg,
|
||||||
|
const mxArray* objective_g1_sparse_colptr_mx_arg,
|
||||||
|
const std::vector<const mxArray*> objective_gN_sparse_indices_arg) :
|
||||||
|
ObjectiveMFilename {modName + ".objective.sparse.static"},
|
||||||
|
kOrder {kOrder_arg},
|
||||||
|
objective_g1_sparse_rowval_mx {objective_g1_sparse_rowval_mx_arg},
|
||||||
|
objective_g1_sparse_colval_mx {objective_g1_sparse_colval_mx_arg},
|
||||||
|
objective_g1_sparse_colptr_mx {objective_g1_sparse_colptr_mx_arg},
|
||||||
|
objective_gN_sparse_indices {objective_gN_sparse_indices_arg}
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
|
||||||
ObjectiveMFile::unpackSparseMatrixAndCopyIntoTwoDMatData(mxArray* sparseMat, TwoDMatrix& tdm)
|
|
||||||
{
|
|
||||||
int totalCols = mxGetN(sparseMat);
|
|
||||||
mwIndex* rowIdxVector = mxGetIr(sparseMat);
|
|
||||||
mwIndex* colIdxVector = mxGetJc(sparseMat);
|
|
||||||
|
|
||||||
assert(tdm.ncols() == 3);
|
|
||||||
/* Under MATLAB, the following check always holds at equality; under Octave,
|
|
||||||
there may be an inequality, because Octave diminishes nzmax if one gives
|
|
||||||
zeros in the values vector when calling sparse(). */
|
|
||||||
assert(tdm.nrows() >= static_cast<int>(mxGetNzmax(sparseMat)));
|
|
||||||
|
|
||||||
double* ptr = mxGetPr(sparseMat);
|
|
||||||
|
|
||||||
int rind = 0;
|
|
||||||
int output_row = 0;
|
|
||||||
|
|
||||||
for (int i = 0; i < totalCols; i++)
|
|
||||||
for (int j = 0; j < static_cast<int>((colIdxVector[i + 1] - colIdxVector[i])); j++, rind++)
|
|
||||||
{
|
|
||||||
tdm.get(output_row, 0) = rowIdxVector[rind] + 1;
|
|
||||||
tdm.get(output_row, 1) = i + 1;
|
|
||||||
tdm.get(output_row, 2) = ptr[rind];
|
|
||||||
output_row++;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If there are less elements than expected (that might happen if some
|
|
||||||
derivative is symbolically not zero but numerically zero at the evaluation
|
|
||||||
point), then fill in the matrix with empty entries, that will be
|
|
||||||
recognized as such by KordpDynare::populateDerivativesContainer() */
|
|
||||||
while (output_row < tdm.nrows())
|
|
||||||
{
|
|
||||||
tdm.get(output_row, 0) = 0;
|
|
||||||
tdm.get(output_row, 1) = 0;
|
|
||||||
tdm.get(output_row, 2) = 0;
|
|
||||||
output_row++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void
|
void
|
||||||
ObjectiveMFile::eval(const Vector& y, const Vector& x, const Vector& modParams, Vector& residual,
|
ObjectiveMFile::eval(const Vector& y, const Vector& x, const Vector& modParams, Vector& residual,
|
||||||
std::vector<TwoDMatrix>& md) noexcept(false)
|
const std::vector<int>& dynToDynpp,
|
||||||
|
TensorContainer<FSSparseTensor>& derivatives) const
|
||||||
{
|
{
|
||||||
mxArray* T_m = mxCreateDoubleMatrix(ntt, 1, mxREAL);
|
mxArray* y_mx = mxCreateDoubleMatrix(y.length(), 1, mxREAL);
|
||||||
|
std::copy_n(y.base(), y.length(), mxGetPr(y_mx));
|
||||||
|
|
||||||
mxArray* y_m = mxCreateDoubleMatrix(y.length(), 1, mxREAL);
|
mxArray* x_mx = mxCreateDoubleMatrix(1, x.length(), mxREAL);
|
||||||
std::copy_n(y.base(), y.length(), mxGetPr(y_m));
|
std::copy_n(x.base(), x.length(), mxGetPr(x_mx));
|
||||||
|
|
||||||
mxArray* x_m = mxCreateDoubleMatrix(1, x.length(), mxREAL);
|
mxArray* params_mx = mxCreateDoubleMatrix(modParams.length(), 1, mxREAL);
|
||||||
std::copy_n(x.base(), x.length(), mxGetPr(x_m));
|
std::copy_n(modParams.base(), modParams.length(), mxGetPr(params_mx));
|
||||||
|
|
||||||
mxArray* params_m = mxCreateDoubleMatrix(modParams.length(), 1, mxREAL);
|
mxArray *T_order_mx, *T_mx;
|
||||||
std::copy_n(modParams.base(), modParams.length(), mxGetPr(params_m));
|
|
||||||
|
|
||||||
mxArray* T_flag_m = mxCreateLogicalScalar(false);
|
|
||||||
|
|
||||||
{
|
|
||||||
// Compute temporary terms (for all orders)
|
|
||||||
std::string funcname = ObjectiveMFilename + "_g" + std::to_string(md.size()) + "_tt";
|
|
||||||
std::array<mxArray*, 1> plhs;
|
|
||||||
std::array prhs {T_m, y_m, x_m, params_m};
|
|
||||||
|
|
||||||
int retVal
|
|
||||||
= mexCallMATLAB(plhs.size(), plhs.data(), prhs.size(), prhs.data(), funcname.c_str());
|
|
||||||
if (retVal != 0)
|
|
||||||
throw DynareException(__FILE__, __LINE__, "Trouble calling " + funcname);
|
|
||||||
|
|
||||||
mxDestroyArray(T_m);
|
|
||||||
T_m = plhs[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
{
|
{
|
||||||
// Compute residuals
|
// Compute residuals
|
||||||
std::string funcname = ObjectiveMFilename + "_resid";
|
std::string funcname = ObjectiveMFilename + "_resid";
|
||||||
std::array<mxArray*, 1> plhs;
|
std::array<mxArray*, 3> plhs;
|
||||||
std::array prhs {T_m, y_m, x_m, params_m, T_flag_m};
|
std::array prhs {y_mx, x_mx, params_mx};
|
||||||
|
|
||||||
int retVal
|
int retVal
|
||||||
= mexCallMATLAB(plhs.size(), plhs.data(), prhs.size(), prhs.data(), funcname.c_str());
|
= mexCallMATLAB(plhs.size(), plhs.data(), prhs.size(), prhs.data(), funcname.c_str());
|
||||||
|
@ -116,35 +69,103 @@ ObjectiveMFile::eval(const Vector& y, const Vector& x, const Vector& modParams,
|
||||||
|
|
||||||
residual = Vector {plhs[0]};
|
residual = Vector {plhs[0]};
|
||||||
mxDestroyArray(plhs[0]);
|
mxDestroyArray(plhs[0]);
|
||||||
|
|
||||||
|
T_order_mx = plhs[1];
|
||||||
|
T_mx = plhs[2];
|
||||||
}
|
}
|
||||||
|
|
||||||
for (size_t i = 1; i <= md.size(); i++)
|
{
|
||||||
|
// Compute Jacobian
|
||||||
|
std::string funcname = ObjectiveMFilename + "_g1";
|
||||||
|
std::array<mxArray*, 3> plhs;
|
||||||
|
std::array prhs {y_mx,
|
||||||
|
x_mx,
|
||||||
|
params_mx,
|
||||||
|
const_cast<mxArray*>(objective_g1_sparse_rowval_mx),
|
||||||
|
const_cast<mxArray*>(objective_g1_sparse_colval_mx),
|
||||||
|
const_cast<mxArray*>(objective_g1_sparse_colptr_mx),
|
||||||
|
T_order_mx,
|
||||||
|
T_mx};
|
||||||
|
|
||||||
|
int retVal
|
||||||
|
= mexCallMATLAB(plhs.size(), plhs.data(), prhs.size(), prhs.data(), funcname.c_str());
|
||||||
|
if (retVal != 0)
|
||||||
|
throw DynareException(__FILE__, __LINE__, "Trouble calling " + funcname);
|
||||||
|
|
||||||
|
assert(static_cast<int>(mxGetN(plhs[0])) == y.length());
|
||||||
|
double* g1_v {mxGetPr(plhs[0])};
|
||||||
|
mwIndex* g1_ir {mxGetIr(plhs[0])};
|
||||||
|
mwIndex* g1_jc {mxGetJc(plhs[0])};
|
||||||
|
|
||||||
|
IntSequence s(1, 0);
|
||||||
|
auto tensor = std::make_unique<FSSparseTensor>(1, y.length(), 1);
|
||||||
|
|
||||||
|
for (int j {0}; j < y.length(); j++)
|
||||||
|
for (mwIndex k {g1_jc[j]}; k < g1_jc[j + 1]; k++)
|
||||||
|
{
|
||||||
|
s[0] = dynToDynpp[j];
|
||||||
|
tensor->insert(s, g1_ir[k], g1_v[k]);
|
||||||
|
}
|
||||||
|
|
||||||
|
mxDestroyArray(plhs[0]);
|
||||||
|
|
||||||
|
mxDestroyArray(T_order_mx);
|
||||||
|
T_order_mx = plhs[1];
|
||||||
|
|
||||||
|
mxDestroyArray(T_mx);
|
||||||
|
T_mx = plhs[2];
|
||||||
|
|
||||||
|
derivatives.insert(std::move(tensor));
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int o {2}; o <= kOrder; o++)
|
||||||
{
|
{
|
||||||
// Compute model derivatives
|
// Compute higher derivatives
|
||||||
std::string funcname = ObjectiveMFilename + "_g" + std::to_string(i);
|
std::string funcname = ObjectiveMFilename + "_g" + std::to_string(o);
|
||||||
std::array<mxArray*, 1> plhs;
|
std::array<mxArray*, 3> plhs;
|
||||||
std::array prhs {T_m, y_m, x_m, params_m, T_flag_m};
|
std::array prhs {y_mx, x_mx, params_mx, T_order_mx, T_mx};
|
||||||
|
|
||||||
int retVal
|
int retVal
|
||||||
= mexCallMATLAB(plhs.size(), plhs.data(), prhs.size(), prhs.data(), funcname.c_str());
|
= mexCallMATLAB(plhs.size(), plhs.data(), prhs.size(), prhs.data(), funcname.c_str());
|
||||||
if (retVal != 0)
|
if (retVal != 0)
|
||||||
throw DynareException(__FILE__, __LINE__, "Trouble calling " + funcname);
|
throw DynareException(__FILE__, __LINE__, "Trouble calling " + funcname);
|
||||||
|
|
||||||
if (i == 1)
|
const mxArray* sparse_indices_mx {objective_gN_sparse_indices[o - 2]};
|
||||||
|
size_t nnz {mxGetM(sparse_indices_mx)};
|
||||||
|
#if MX_HAS_INTERLEAVED_COMPLEX
|
||||||
|
const int32_T* sparse_indices {mxGetInt32s(sparse_indices_mx)};
|
||||||
|
#else
|
||||||
|
const int32_T* sparse_indices {static_cast<const int32_T*>(mxGetData(sparse_indices_mx))};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
assert(mxGetNumberOfElements(plhs[0]) == nnz);
|
||||||
|
double* gN_v {mxGetPr(plhs[0])};
|
||||||
|
|
||||||
|
IntSequence s(o, 0);
|
||||||
|
auto tensor = std::make_unique<FSSparseTensor>(o, y.length(), 1);
|
||||||
|
|
||||||
|
for (size_t k {0}; k < nnz; k++)
|
||||||
{
|
{
|
||||||
assert(static_cast<int>(mxGetM(plhs[0])) == md[i - 1].nrows());
|
for (int i {0}; i < o; i++)
|
||||||
assert(static_cast<int>(mxGetN(plhs[0])) == md[i - 1].ncols());
|
s[i] = dynToDynpp[sparse_indices[k + (i + 1) * nnz] - 1];
|
||||||
std::copy_n(mxGetPr(plhs[0]), mxGetM(plhs[0]) * mxGetN(plhs[0]), md[i - 1].base());
|
assert(s.isSorted());
|
||||||
|
tensor->insert(s, sparse_indices[k] - 1, gN_v[k]);
|
||||||
}
|
}
|
||||||
else
|
|
||||||
unpackSparseMatrixAndCopyIntoTwoDMatData(plhs[0], md[i - 1]);
|
|
||||||
|
|
||||||
mxDestroyArray(plhs[0]);
|
mxDestroyArray(plhs[0]);
|
||||||
|
|
||||||
|
mxDestroyArray(T_order_mx);
|
||||||
|
T_order_mx = plhs[1];
|
||||||
|
|
||||||
|
mxDestroyArray(T_mx);
|
||||||
|
T_mx = plhs[2];
|
||||||
|
|
||||||
|
derivatives.insert(std::move(tensor));
|
||||||
}
|
}
|
||||||
|
|
||||||
mxDestroyArray(T_m);
|
mxDestroyArray(y_mx);
|
||||||
mxDestroyArray(y_m);
|
mxDestroyArray(x_mx);
|
||||||
mxDestroyArray(x_m);
|
mxDestroyArray(params_mx);
|
||||||
mxDestroyArray(params_m);
|
mxDestroyArray(T_order_mx);
|
||||||
mxDestroyArray(T_flag_m);
|
mxDestroyArray(T_mx);
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
/*
|
/*
|
||||||
* Copyright © 2021-2023 Dynare Team
|
* Copyright © 2021-2024 Dynare Team
|
||||||
*
|
*
|
||||||
* This file is part of Dynare.
|
* This file is part of Dynare.
|
||||||
*
|
*
|
||||||
|
@ -20,24 +20,34 @@
|
||||||
#ifndef OBJECTIVE_M_HH
|
#ifndef OBJECTIVE_M_HH
|
||||||
#define OBJECTIVE_M_HH
|
#define OBJECTIVE_M_HH
|
||||||
|
|
||||||
#include "objective_abstract_class.hh"
|
#include <vector>
|
||||||
|
|
||||||
#include "mex.h"
|
#include "dynmex.h"
|
||||||
#include <dynmex.h>
|
|
||||||
|
|
||||||
/**
|
#include "Vector.hh"
|
||||||
* handles calls to <model>/+objective/static.m
|
#include "sparse_tensor.hh"
|
||||||
*
|
#include "t_container.hh"
|
||||||
**/
|
|
||||||
class ObjectiveMFile : public ObjectiveAC
|
// Handles calls to <model>/+objective/+sparse/static*.m
|
||||||
|
class ObjectiveMFile
|
||||||
{
|
{
|
||||||
private:
|
private:
|
||||||
const std::string ObjectiveMFilename;
|
const std::string ObjectiveMFilename;
|
||||||
static void unpackSparseMatrixAndCopyIntoTwoDMatData(mxArray* sparseMat, TwoDMatrix& tdm);
|
const int kOrder;
|
||||||
|
const mxArray *const objective_g1_sparse_rowval_mx, *const objective_g1_sparse_colval_mx,
|
||||||
|
*const objective_g1_sparse_colptr_mx;
|
||||||
|
// Stores M_.objective_gN_sparse_indices, starting from N=2
|
||||||
|
const std::vector<const mxArray*> objective_gN_sparse_indices;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit ObjectiveMFile(const std::string& modName, int ntt_arg);
|
ObjectiveMFile(const std::string& modName, int kOrder_arg,
|
||||||
|
const mxArray* objective_g1_sparse_rowval_mx_arg,
|
||||||
|
const mxArray* objective_g1_sparse_colval_mx_arg,
|
||||||
|
const mxArray* objective_g1_sparse_colptr_mx_arg,
|
||||||
|
const std::vector<const mxArray*> objective_gN_sparse_indices_arg);
|
||||||
void eval(const Vector& y, const Vector& x, const Vector& params, Vector& residual,
|
void eval(const Vector& y, const Vector& x, const Vector& params, Vector& residual,
|
||||||
std::vector<TwoDMatrix>& md) override;
|
const std::vector<int>& dynToDynpp, TensorContainer<FSSparseTensor>& derivatives) const
|
||||||
|
noexcept(false);
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
Subproject commit b134dba32c9bfc8e0ee25c4977e37558721d7737
|
Subproject commit d8866fbec8a09df0d8fa1d2e7e60b2aae8685ea8
|
|
@ -49,30 +49,28 @@ clean-all: clean-lib clean-src clean-tar
|
||||||
|
|
||||||
tarballs/slicot-$(SLICOT_VERSION).tar.gz:
|
tarballs/slicot-$(SLICOT_VERSION).tar.gz:
|
||||||
mkdir -p tarballs
|
mkdir -p tarballs
|
||||||
wget $(WGET_OPTIONS) -O $@ https://deb.debian.org/debian/pool/main/s/slicot/slicot_$(SLICOT_VERSION).orig.tar.gz
|
wget $(WGET_OPTIONS) -O $@ https://deb.debian.org/debian/pool/main/s/slicot/slicot_$(SLICOT_VERSION).orig.tar.xz
|
||||||
|
|
||||||
sources64/slicot-$(SLICOT_VERSION)-with-64bit-integer: tarballs/slicot-$(SLICOT_VERSION).tar.gz
|
sources64/slicot-$(SLICOT_VERSION)-with-64bit-integer: tarballs/slicot-$(SLICOT_VERSION).tar.gz
|
||||||
rm -rf sources64/slicot-*-with-64bit-integer
|
rm -rf sources64/slicot-*-with-64bit-integer
|
||||||
mkdir -p $@
|
mkdir -p $@
|
||||||
tar xf $< --directory $@ --strip-components=1
|
tar xf $< --directory $@ --strip-components=1
|
||||||
patch -d $@ -p1 < slicot-build-system.patch
|
|
||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
sources64/slicot-$(SLICOT_VERSION)-with-32bit-integer-and-underscore: tarballs/slicot-$(SLICOT_VERSION).tar.gz
|
sources64/slicot-$(SLICOT_VERSION)-with-32bit-integer-and-underscore: tarballs/slicot-$(SLICOT_VERSION).tar.gz
|
||||||
rm -rf sources64/slicot-*-with-32bit-integer-and-underscore
|
rm -rf sources64/slicot-*-with-32bit-integer-and-underscore
|
||||||
mkdir -p $@
|
mkdir -p $@
|
||||||
tar xf $< --directory $@ --strip-components=1
|
tar xf $< --directory $@ --strip-components=1
|
||||||
patch -d $@ -p1 < slicot-build-system.patch
|
|
||||||
touch $@
|
touch $@
|
||||||
|
|
||||||
lib64/Slicot/without-underscore/libslicot64_pic.a: sources64/slicot-$(SLICOT_VERSION)-with-64bit-integer
|
lib64/Slicot/without-underscore/libslicot64_pic.a: sources64/slicot-$(SLICOT_VERSION)-with-64bit-integer
|
||||||
make -C $< -f makefile_Unix lib SLICOTLIB=../libslicot64_pic.a FFLAGS="$(FFLAGS) -fno-underscoring -fdefault-integer-8" FC=x86_64-w64-mingw32-gfortran LOADER=x86_64-w64-mingw32-gfortran ARCH=x86_64-w64-mingw32-ar
|
make -C $< -f makefile_Unix lib SLICOTLIB=../libslicot64_pic.a OPTS="$(FFLAGS) -fno-underscoring -fdefault-integer-8" FORTRAN=x86_64-w64-mingw32-gfortran LOADER=x86_64-w64-mingw32-gfortran ARCH=x86_64-w64-mingw32-ar
|
||||||
x86_64-w64-mingw32-strip --strip-debug $</libslicot64_pic.a
|
x86_64-w64-mingw32-strip --strip-debug $</libslicot64_pic.a
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
cp $</libslicot64_pic.a $@
|
cp $</libslicot64_pic.a $@
|
||||||
|
|
||||||
lib64/Slicot/with-underscore/libslicot_pic.a: sources64/slicot-$(SLICOT_VERSION)-with-32bit-integer-and-underscore
|
lib64/Slicot/with-underscore/libslicot_pic.a: sources64/slicot-$(SLICOT_VERSION)-with-32bit-integer-and-underscore
|
||||||
make -C $< -f makefile_Unix lib SLICOTLIB=../libslicot_pic.a FFLAGS="$(FFLAGS)" FC=x86_64-w64-mingw32-gfortran LOADER=x86_64-w64-mingw32-gfortran ARCH=x86_64-w64-mingw32-ar
|
make -C $< -f makefile_Unix lib SLICOTLIB=../libslicot_pic.a OPTS="$(FFLAGS)" FORTRAN=x86_64-w64-mingw32-gfortran LOADER=x86_64-w64-mingw32-gfortran ARCH=x86_64-w64-mingw32-ar
|
||||||
x86_64-w64-mingw32-strip --strip-debug $</libslicot_pic.a
|
x86_64-w64-mingw32-strip --strip-debug $</libslicot_pic.a
|
||||||
mkdir -p $(dir $@)
|
mkdir -p $(dir $@)
|
||||||
cp $</libslicot_pic.a $@
|
cp $</libslicot_pic.a $@
|
||||||
|
|
|
@ -1,593 +0,0 @@
|
||||||
Description: Various fixes to the build system
|
|
||||||
Author: Sébastien Villemot <sebastien@debian.org>
|
|
||||||
Forwarded: https://github.com/SLICOT/SLICOT-Reference/pull/14
|
|
||||||
Last-Update: 2024-01-16
|
|
||||||
---
|
|
||||||
This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
|
|
||||||
--- a/makefile_Unix
|
|
||||||
+++ b/makefile_Unix
|
|
||||||
@@ -43,15 +43,15 @@ all: lib example
|
|
||||||
clean: cleanlib cleanexample
|
|
||||||
|
|
||||||
lib:
|
|
||||||
- ( cd src; $(MAKE) )
|
|
||||||
- ( cd src_aux; $(MAKE) )
|
|
||||||
+ ( cd src; $(MAKE) -f makefile_Unix )
|
|
||||||
+ ( cd src_aux; $(MAKE) -f makefile_Unix )
|
|
||||||
|
|
||||||
example:
|
|
||||||
- ( cd examples; $(MAKE) )
|
|
||||||
+ ( cd examples; $(MAKE) -f makefile_Unix )
|
|
||||||
|
|
||||||
cleanlib:
|
|
||||||
- ( cd src; $(MAKE) clean )
|
|
||||||
- ( cd src_aux; $(MAKE) clean )
|
|
||||||
+ ( cd src; $(MAKE) -f makefile_Unix clean )
|
|
||||||
+ ( cd src_aux; $(MAKE) -f makefile_Unix clean )
|
|
||||||
|
|
||||||
cleanexample:
|
|
||||||
- ( cd examples; $(MAKE) clean )
|
|
||||||
+ ( cd examples; $(MAKE) -f makefile_Unix clean )
|
|
||||||
--- a/src/makefile_Unix
|
|
||||||
+++ b/src/makefile_Unix
|
|
||||||
@@ -28,7 +28,7 @@
|
|
||||||
#
|
|
||||||
#######################################################################
|
|
||||||
|
|
||||||
-include ../make.inc
|
|
||||||
+include ../make_Unix.inc
|
|
||||||
|
|
||||||
SLSRC = \
|
|
||||||
AB01MD.o AB01ND.o AB01OD.o AB04MD.o AB05MD.o AB05ND.o AB05OD.o \
|
|
||||||
@@ -78,8 +78,8 @@ SLSRC = \
|
|
||||||
MB04GD.o MB04HD.o MB04ID.o MB04IY.o MB04IZ.o MB04JD.o MB04KD.o \
|
|
||||||
MB04LD.o MB04MD.o MB04ND.o MB04NY.o MB04OD.o MB04OW.o MB04OX.o \
|
|
||||||
MB04OY.o MB04PA.o MB04PB.o MB04PU.o MB04PY.o MB04QB.o MB04QC.o \
|
|
||||||
- MB04QF.o MB04QS.o MB04QU.o MB04RB.o MB04RD.o MB04RS.o MB04RT.o \
|
|
||||||
- MB04RU.o MB04RV.o MB04RW.o MB04RZ.o MB04SU.o MB04TB.o MB04TS.o \
|
|
||||||
+ MB04QF.o MB04QS.o MB04QU.o MB04RB.o \
|
|
||||||
+ MB04RU.o MB04SU.o MB04TB.o MB04TS.o \
|
|
||||||
MB04TT.o MB04TU.o MB04TV.o MB04TW.o MB04TX.o MB04TY.o MB04UD.o \
|
|
||||||
MB04VD.o MB04VX.o MB04WD.o MB04WP.o MB04WR.o MB04WU.o MB04XD.o \
|
|
||||||
MB04XY.o MB04YD.o MB04YW.o MB04ZD.o MB05MD.o MB05MY.o MB05ND.o \
|
|
||||||
@@ -121,8 +121,7 @@ SLSRC = \
|
|
||||||
TG01HD.o TG01HU.o TG01HX.o TG01HY.o TG01ID.o TG01JD.o TG01JY.o \
|
|
||||||
TG01KD.o TG01KZ.o TG01LD.o TG01LY.o TG01MD.o TG01ND.o TG01NX.o \
|
|
||||||
TG01OA.o TG01OB.o TG01OD.o TG01OZ.o TG01PD.o TG01QD.o TG01WD.o \
|
|
||||||
- UD01BD.o UD01CD.o UD01DD.o UD01MD.o UD01MZ.o UD01ND.o UE01MD.o \
|
|
||||||
- zelctg.o
|
|
||||||
+ UD01BD.o UD01CD.o UD01DD.o UD01MD.o UD01MZ.o UD01ND.o UE01MD.o
|
|
||||||
|
|
||||||
all: $(SLSRC)
|
|
||||||
$(ARCH) $(ARCHFLAGS) $(SLICOTLIB) $(SLSRC)
|
|
||||||
@@ -136,4 +135,4 @@ clean:
|
|
||||||
rm -f *.o
|
|
||||||
|
|
||||||
.f.o:
|
|
||||||
- $(FORTRAN) $(OPTS) -c $<
|
|
||||||
+ $(FC) $(FFLAGS) -c $<
|
|
||||||
--- a/examples/makefile_Unix
|
|
||||||
+++ b/examples/makefile_Unix
|
|
||||||
@@ -850,248 +850,248 @@ cleanup:
|
|
||||||
TTG01ID TTG01JD TTG01JY TTG01LD TTG01MD TTG01ND TTG01PD TTG01QD \
|
|
||||||
TUD01BD TUD01CD TUD01DD TUD01MD TUD01ND
|
|
||||||
|
|
||||||
-TAB01MD.o: TAB01MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB01ND.o: TAB01ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB01OD.o: TAB01OD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB04MD.o: TAB04MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB05MD.o: TAB05MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB05ND.o: TAB05ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB05OD.o: TAB05OD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB05PD.o: TAB05PD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB05QD.o: TAB05QD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB05RD.o: TAB05RD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB07MD.o: TAB07MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB07ND.o: TAB07ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB08ND.o: TAB08ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB08NW.o: TAB08NW.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB08NZ.o: TAB08NZ.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB09AD.o: TAB09AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB09BD.o: TAB09BD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB09CD.o: TAB09CD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB09DD.o: TAB09DD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB09ED.o: TAB09ED.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB09FD.o: TAB09FD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB09GD.o: TAB09GD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB09HD.o: TAB09HD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB09ID.o: TAB09ID.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB09JD.o: TAB09JD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB09KD.o: TAB09KD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB09MD.o: TAB09MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB09ND.o: TAB09ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB13AD.o: TAB13AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB13BD.o: TAB13BD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB13CD.o: TAB13CD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB13DD.o: TAB13DD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB13ED.o: TAB13ED.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB13FD.o: TAB13FD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB13ID.o: TAB13ID.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAB13MD.o: TAB13MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAG08BD.o: TAG08BD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TAG08BZ.o: TAG08BZ.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TBB01AD.o: TBB01AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TBB02AD.o: TBB02AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TBB03AD.o: TBB03AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TBB04AD.o: TBB04AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TBD01AD.o: TBD01AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TBD02AD.o: TBD02AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TDE01OD.o: TDE01OD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TDE01PD.o: TDE01PD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TDF01MD.o: TDF01MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TDG01MD.o: TDG01MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TDG01ND.o: TDG01ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TDG01OD.o: TDG01OD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TDK01MD.o: TDK01MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TFB01QD.o: TFB01QD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TFB01RD.o: TFB01RD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TFB01SD.o: TFB01SD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TFB01TD.o: TFB01TD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TFB01VD.o: TFB01VD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TFD01AD.o: TFD01AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TIB01AD.o: TIB01AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TIB01BD.o: TIB01BD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TIB01CD.o: TIB01CD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TIB03AD.o: TIB03AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TIB03BD.o: TIB03BD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB01TD.o: TMB01TD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02CD.o: TMB02CD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02DD.o: TMB02DD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02ED.o: TMB02ED.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02FD.o: TMB02FD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02GD.o: TMB02GD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02HD.o: TMB02HD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02ID.o: TMB02ID.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02JD.o: TMB02JD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02JX.o: TMB02JX.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02KD.o: TMB02KD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02MD.o: TMB02MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02ND.o: TMB02ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02QD.o: TMB02QD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02SD.o: TMB02SD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB02VD.o: TMB02VD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03BD.o: TMB03BD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03BZ.o: TMB03BZ.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03FZ.o: TMB03FZ.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03KD.o: TMB03KD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03LD.o: TMB03LD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03LF.o: TMB03LF.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03LZ.o: TMB03LZ.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03MD.o: TMB03MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03ND.o: TMB03ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03OD.o: TMB03OD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03PD.o: TMB03PD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03QD.o: TMB03QD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03QG.o: TMB03QG.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03RD.o: TMB03RD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03SD.o: TMB03SD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03TD.o: TMB03TD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03UD.o: TMB03UD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03VD.o: TMB03VD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03WD.o: TMB03WD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03XD.o: TMB03XD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03XP.o: TMB03XP.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03XZ.o: TMB03XZ.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB03ZD.o: TMB03ZD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04AD.o: TMB04AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04AZ.o: TMB04AZ.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04BD.o: TMB04BD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04BZ.o: TMB04BZ.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04DD.o: TMB04DD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04DL.o: TMB04DL.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB4DLZ.o: TMB4DLZ.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04DP.o: TMB04DP.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB4DPZ.o: TMB4DPZ.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04DS.o: TMB04DS.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04DY.o: TMB04DY.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04DZ.o: TMB04DZ.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04ED.o: TMB04ED.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04FD.o: TMB04FD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04GD.o: TMB04GD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04MD.o: TMB04MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04OD.o: TMB04OD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04PB.o: TMB04PB.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04PU.o: TMB04PU.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04TB.o: TMB04TB.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04TS.o: TMB04TS.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04UD.o: TMB04UD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04VD.o: TMB04VD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04XD.o: TMB04XD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04YD.o: TMB04YD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB04ZD.o: TMB04ZD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB05MD.o: TMB05MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB05ND.o: TMB05ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMB05OD.o: TMB05OD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMC01MD.o: TMC01MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMC01ND.o: TMC01ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMC01OD.o: TMC01OD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMC01PD.o: TMC01PD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMC01QD.o: TMC01QD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMC01RD.o: TMC01RD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMC01SD.o: TMC01SD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMC01TD.o: TMC01TD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMC01VD.o: TMC01VD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMC01WD.o: TMC01WD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMC01XD.o: TMC01XD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMC03MD.o: TMC03MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMC03ND.o: TMC03ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMD03AD.o: TMD03AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TMD03BD.o: TMD03BD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB01BD.o: TSB01BD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB01DD.o: TSB01DD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB01MD.o: TSB01MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB02MD.o: TSB02MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB02ND.o: TSB02ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB02OD.o: TSB02OD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB02PD.o: TSB02PD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB02QD.o: TSB02QD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB02RD.o: TSB02RD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB02SD.o: TSB02SD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB03MD.o: TSB03MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB03OD.o: TSB03OD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB03QD.o: TSB03QD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB03SD.o: TSB03SD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB03TD.o: TSB03TD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB03UD.o: TSB03UD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB04MD.o: TSB04MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB04ND.o: TSB04ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB04OD.o: TSB04OD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB04PD.o: TSB04PD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB04QD.o: TSB04QD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB04RD.o: TSB04RD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB06ND.o: TSB06ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB08CD.o: TSB08CD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB08DD.o: TSB08DD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB08ED.o: TSB08ED.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB08FD.o: TSB08FD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB08MD.o: TSB08MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB08ND.o: TSB08ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB09MD.o: TSB09MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB10DD.o: TSB10DD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB10ED.o: TSB10ED.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB10FD.o: TSB10FD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB10HD.o: TSB10HD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB10ID.o: TSB10ID.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB10KD.o: TSB10KD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB10ZD.o: TSB10ZD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB16AD.o: TSB16AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB16BD.o: TSB16BD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSB16CD.o: TSB16CD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSG02AD.o: TSG02AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSG02ND.o: TSG02ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSG03AD.o: TSG03AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TSG03BD.o: TSG03BD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB01ID.o: TTB01ID.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB01IZ.o: TTB01IZ.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB01KD.o: TTB01KD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB01LD.o: TTB01LD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB01MD.o: TTB01MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB01ND.o: TTB01ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB01PD.o: TTB01PD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB01PX.o: TTB01PX.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB01TD.o: TTB01TD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB01UD.o: TTB01UD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB01UY.o: TTB01UY.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB01WD.o: TTB01WD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB01WX.o: TTB01WX.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB01ZD.o: TTB01ZD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB03AD.o: TTB03AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB04AD.o: TTB04AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB04BD.o: TTB04BD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB04CD.o: TTB04CD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTB05AD.o: TTB05AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTC01OD.o: TTC01OD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTC04AD.o: TTC04AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTC05AD.o: TTC05AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTD03AD.o: TTD03AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTD04AD.o: TTD04AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTD05AD.o: TTD05AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTF01MD.o: TTF01MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTF01ND.o: TTF01ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTF01OD.o: TTF01OD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTF01PD.o: TTF01PD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTF01QD.o: TTF01QD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTF01RD.o: TTF01RD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01AD.o: TTG01AD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01AZ.o: TTG01AZ.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01CD.o: TTG01CD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01DD.o: TTG01DD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01ED.o: TTG01ED.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01FD.o: TTG01FD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01FZ.o: TTG01FZ.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01GD.o: TTG01GD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01HD.o: TTG01HD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01ID.o: TTG01ID.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01JD.o: TTG01JD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01JY.o: TTG01JY.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01LD.o: TTG01LD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01MD.o: TTG01MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01ND.o: TTG01ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01PD.o: TTG01PD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TTG01QD.o: TTG01QD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TUD01BD.o: TUD01BD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TUD01CD.o: TUD01CD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TUD01DD.o: TUD01DD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TUD01MD.o: TUD01MD.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
-TUD01ND.o: TUD01ND.f ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
+TAB01MD.o: TAB01MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB01ND.o: TAB01ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB01OD.o: TAB01OD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB04MD.o: TAB04MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB05MD.o: TAB05MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB05ND.o: TAB05ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB05OD.o: TAB05OD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB05PD.o: TAB05PD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB05QD.o: TAB05QD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB05RD.o: TAB05RD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB07MD.o: TAB07MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB07ND.o: TAB07ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB08ND.o: TAB08ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB08NW.o: TAB08NW.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB08NZ.o: TAB08NZ.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB09AD.o: TAB09AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB09BD.o: TAB09BD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB09CD.o: TAB09CD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB09DD.o: TAB09DD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB09ED.o: TAB09ED.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB09FD.o: TAB09FD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB09GD.o: TAB09GD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB09HD.o: TAB09HD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB09ID.o: TAB09ID.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB09JD.o: TAB09JD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB09KD.o: TAB09KD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB09MD.o: TAB09MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB09ND.o: TAB09ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB13AD.o: TAB13AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB13BD.o: TAB13BD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB13CD.o: TAB13CD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB13DD.o: TAB13DD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB13ED.o: TAB13ED.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB13FD.o: TAB13FD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB13ID.o: TAB13ID.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAB13MD.o: TAB13MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAG08BD.o: TAG08BD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TAG08BZ.o: TAG08BZ.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TBB01AD.o: TBB01AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TBB02AD.o: TBB02AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TBB03AD.o: TBB03AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TBB04AD.o: TBB04AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TBD01AD.o: TBD01AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TBD02AD.o: TBD02AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TDE01OD.o: TDE01OD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TDE01PD.o: TDE01PD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TDF01MD.o: TDF01MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TDG01MD.o: TDG01MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TDG01ND.o: TDG01ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TDG01OD.o: TDG01OD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TDK01MD.o: TDK01MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TFB01QD.o: TFB01QD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TFB01RD.o: TFB01RD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TFB01SD.o: TFB01SD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TFB01TD.o: TFB01TD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TFB01VD.o: TFB01VD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TFD01AD.o: TFD01AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TIB01AD.o: TIB01AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TIB01BD.o: TIB01BD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TIB01CD.o: TIB01CD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TIB03AD.o: TIB03AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TIB03BD.o: TIB03BD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB01TD.o: TMB01TD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02CD.o: TMB02CD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02DD.o: TMB02DD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02ED.o: TMB02ED.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02FD.o: TMB02FD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02GD.o: TMB02GD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02HD.o: TMB02HD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02ID.o: TMB02ID.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02JD.o: TMB02JD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02JX.o: TMB02JX.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02KD.o: TMB02KD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02MD.o: TMB02MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02ND.o: TMB02ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02QD.o: TMB02QD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02SD.o: TMB02SD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB02VD.o: TMB02VD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03BD.o: TMB03BD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03BZ.o: TMB03BZ.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03FZ.o: TMB03FZ.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03KD.o: TMB03KD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03LD.o: TMB03LD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03LF.o: TMB03LF.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03LZ.o: TMB03LZ.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03MD.o: TMB03MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03ND.o: TMB03ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03OD.o: TMB03OD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03PD.o: TMB03PD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03QD.o: TMB03QD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03QG.o: TMB03QG.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03RD.o: TMB03RD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03SD.o: TMB03SD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03TD.o: TMB03TD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03UD.o: TMB03UD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03VD.o: TMB03VD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03WD.o: TMB03WD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03XD.o: TMB03XD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03XP.o: TMB03XP.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03XZ.o: TMB03XZ.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB03ZD.o: TMB03ZD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04AD.o: TMB04AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04AZ.o: TMB04AZ.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04BD.o: TMB04BD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04BZ.o: TMB04BZ.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04DD.o: TMB04DD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04DL.o: TMB04DL.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB4DLZ.o: TMB4DLZ.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04DP.o: TMB04DP.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB4DPZ.o: TMB4DPZ.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04DS.o: TMB04DS.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04DY.o: TMB04DY.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04DZ.o: TMB04DZ.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04ED.o: TMB04ED.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04FD.o: TMB04FD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04GD.o: TMB04GD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04MD.o: TMB04MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04OD.o: TMB04OD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04PB.o: TMB04PB.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04PU.o: TMB04PU.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04TB.o: TMB04TB.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04TS.o: TMB04TS.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04UD.o: TMB04UD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04VD.o: TMB04VD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04XD.o: TMB04XD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04YD.o: TMB04YD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB04ZD.o: TMB04ZD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB05MD.o: TMB05MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB05ND.o: TMB05ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMB05OD.o: TMB05OD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMC01MD.o: TMC01MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMC01ND.o: TMC01ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMC01OD.o: TMC01OD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMC01PD.o: TMC01PD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMC01QD.o: TMC01QD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMC01RD.o: TMC01RD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMC01SD.o: TMC01SD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMC01TD.o: TMC01TD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMC01VD.o: TMC01VD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMC01WD.o: TMC01WD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMC01XD.o: TMC01XD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMC03MD.o: TMC03MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMC03ND.o: TMC03ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMD03AD.o: TMD03AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TMD03BD.o: TMD03BD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB01BD.o: TSB01BD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB01DD.o: TSB01DD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB01MD.o: TSB01MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB02MD.o: TSB02MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB02ND.o: TSB02ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB02OD.o: TSB02OD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB02PD.o: TSB02PD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB02QD.o: TSB02QD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB02RD.o: TSB02RD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB02SD.o: TSB02SD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB03MD.o: TSB03MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB03OD.o: TSB03OD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB03QD.o: TSB03QD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB03SD.o: TSB03SD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB03TD.o: TSB03TD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB03UD.o: TSB03UD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB04MD.o: TSB04MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB04ND.o: TSB04ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB04OD.o: TSB04OD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB04PD.o: TSB04PD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB04QD.o: TSB04QD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB04RD.o: TSB04RD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB06ND.o: TSB06ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB08CD.o: TSB08CD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB08DD.o: TSB08DD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB08ED.o: TSB08ED.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB08FD.o: TSB08FD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB08MD.o: TSB08MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB08ND.o: TSB08ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB09MD.o: TSB09MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB10DD.o: TSB10DD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB10ED.o: TSB10ED.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB10FD.o: TSB10FD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB10HD.o: TSB10HD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB10ID.o: TSB10ID.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB10KD.o: TSB10KD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB10ZD.o: TSB10ZD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB16AD.o: TSB16AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB16BD.o: TSB16BD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSB16CD.o: TSB16CD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSG02AD.o: TSG02AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSG02ND.o: TSG02ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSG03AD.o: TSG03AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TSG03BD.o: TSG03BD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB01ID.o: TTB01ID.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB01IZ.o: TTB01IZ.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB01KD.o: TTB01KD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB01LD.o: TTB01LD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB01MD.o: TTB01MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB01ND.o: TTB01ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB01PD.o: TTB01PD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB01PX.o: TTB01PX.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB01TD.o: TTB01TD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB01UD.o: TTB01UD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB01UY.o: TTB01UY.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB01WD.o: TTB01WD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB01WX.o: TTB01WX.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB01ZD.o: TTB01ZD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB03AD.o: TTB03AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB04AD.o: TTB04AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB04BD.o: TTB04BD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB04CD.o: TTB04CD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTB05AD.o: TTB05AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTC01OD.o: TTC01OD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTC04AD.o: TTC04AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTC05AD.o: TTC05AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTD03AD.o: TTD03AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTD04AD.o: TTD04AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTD05AD.o: TTD05AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTF01MD.o: TTF01MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTF01ND.o: TTF01ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTF01OD.o: TTF01OD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTF01PD.o: TTF01PD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTF01QD.o: TTF01QD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTF01RD.o: TTF01RD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01AD.o: TTG01AD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01AZ.o: TTG01AZ.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01CD.o: TTG01CD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01DD.o: TTG01DD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01ED.o: TTG01ED.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01FD.o: TTG01FD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01FZ.o: TTG01FZ.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01GD.o: TTG01GD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01HD.o: TTG01HD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01ID.o: TTG01ID.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01JD.o: TTG01JD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01JY.o: TTG01JY.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01LD.o: TTG01LD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01MD.o: TTG01MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01ND.o: TTG01ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01PD.o: TTG01PD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TTG01QD.o: TTG01QD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TUD01BD.o: TUD01BD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TUD01CD.o: TUD01CD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TUD01DD.o: TUD01DD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TUD01MD.o: TUD01MD.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
+TUD01ND.o: TUD01ND.f ; $(FC) $(FFLAGS) -c $<
|
|
||||||
|
|
||||||
-.f.o: ; $(FORTRAN) $(OPTS) -c $<
|
|
||||||
+.f.o: ; $(FC) $(FFLAGS) -c $<
|
|
||||||
|
|
||||||
--- a/make_Unix.inc
|
|
||||||
+++ b/make_Unix.inc
|
|
||||||
@@ -14,7 +14,6 @@ SHELL = /bin/sh
|
|
||||||
#
|
|
||||||
FC = gfortran
|
|
||||||
FFLAGS = -O2 -fPIC -fdefault-integer-8
|
|
||||||
-FFLAGS_NOOPT = -O0
|
|
||||||
|
|
||||||
# Define LDFLAGS to the desired linker options for your machine.
|
|
||||||
#
|
|
||||||
@@ -24,10 +23,11 @@ LDFLAGS =
|
|
||||||
# (library). If your system has no ranlib, set RANLIB = echo.
|
|
||||||
#
|
|
||||||
ARCH = ar
|
|
||||||
-ARFLAGS = cr
|
|
||||||
+ARCHFLAGS = cr
|
|
||||||
# ARCHFLAGS= r
|
|
||||||
# RANLIB = ranlib
|
|
||||||
|
|
||||||
+LOADER = $(FC)
|
|
||||||
LOADOPTS = $(SLICOTLIB) $(LPKAUXLIB) $(LAPACKLIB) $(BLASLIB)
|
|
||||||
#
|
|
||||||
# The location of the libraries to which you will link. (The
|
|
||||||
--- a/src_aux/makefile_Unix
|
|
||||||
+++ b/src_aux/makefile_Unix
|
|
||||||
@@ -47,4 +47,4 @@ clean:
|
|
||||||
rm -f *.o
|
|
||||||
|
|
||||||
.f.o:
|
|
||||||
- $(FORTRAN) $(OPTS) -c $<
|
|
||||||
+ $(FC) $(FFLAGS) -c $<
|
|
|
@ -1,4 +1,4 @@
|
||||||
SLICOT_VERSION = 5.8+20230223.git401037e
|
SLICOT_VERSION = 5.9~20240205.gita037f7e
|
||||||
X13AS_VERSION = 1-1-b60
|
X13AS_VERSION = 1-1-b60
|
||||||
|
|
||||||
OCTAVE_VERSION = 8.4.0
|
OCTAVE_VERSION = 8.4.0
|
||||||
|
|
Loading…
Reference in New Issue